Compare commits

..

10 Commits

Author SHA1 Message Date
SongSongSo 60ba0bf134 🔀 解决冲突 2023-07-20 16:09:06 +08:00
SongSongSo 5450af7a0e 解决冲突 2023-07-20 15:44:01 +08:00
lxy829 62025ee15b 🎨 修正缺少命名空间 2023-07-19 19:20:59 +08:00
lxy829 42bab60aab Merge branch 'v3.x' into features/localization/resx 2023-07-19 17:24:04 +08:00
lxy829 a245d2b305 🎨 修改遗漏资源 2023-07-19 17:21:32 +08:00
lxy829 583c2cd487 解决冲突 2023-07-19 16:39:47 +08:00
lxy829 43358cf808 merge 2023-07-19 15:45:16 +08:00
lxy829 8198ad8e44 删除未引用的resource 2023-07-19 14:50:27 +08:00
lxy829 6d8e5c18db 🎨 #290 2023-07-18 18:59:04 +08:00
lxy829 b14cc2f74a 字符串替换resource 2023-07-17 19:40:07 +08:00
991 changed files with 13480 additions and 62814 deletions
-8
View File
@@ -1,8 +0,0 @@
# These are supported funding model platforms
# github: rmbadmin
ko_fi: rmbgame
patreon: rmbgame
# "https://paypal.me/rmbgame"
custom: ["https://afdian.net/@rmbgame"]
-11
View File
@@ -17,15 +17,11 @@ assignees: ''
发布前请先尝试在 Issues 内搜索一下你的问题是否已经被提出过,
详细地描述 bug,让大家都能理解,请一定确定你所要发布的内容是一个 Bug,如果不确定请发 Question
别忘了填写标题,标题要简短的描述问题
Before posting, please try searching in Issues to see if your question has already been asked,
Describe the bug in detail so that everyone can understand it
Don't forget to fill in the title, which should briefly describe the problem
-->
### 🐛 描述
<!--
详细的描述该问题
Describe the problem in detail
-->
@@ -34,8 +30,6 @@ Describe the problem in detail
<!--
清晰描述复现步骤,让别人也能看到问题
确保上述步骤尽可能能够在大多数设备上 100% 复现,以便定位问题原因
Clearly describe the reproduction steps so that others can see the problem
Ensure that the above steps can be reproduced 100% on most devices as far as possible in order to locate the cause of the problem
-->
1.
2.
@@ -43,9 +37,6 @@ Ensure that the above steps can be reproduced 100% on most devices as far as pos
### 📄 日志信息
<!--
在程序内 设置 - 通用设置 - 存储空间 - 打开Logs文件夹 找到当天的日志,将文件上传或将关键部分写在此处,在内容的开始与结束上加上 ``` 单独作为一行,如下所示
Set in the program - General Settings - storage space - open the logs folder to find the log of the day, upload the file or write the key part here, and add ``` to the beginning and end of the content as a separate line, as shown below
```
- 日志文件所在文件夹路径
- Microsoft Store ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalCache\Logs```
@@ -54,7 +45,6 @@ Set in the program - General Settings - storage space - open the logs folder to
- Linux ```$XDG_CACHE_HOME/Steam++/Logs``` or ```$HOME/.cache/Steam++/Logs```
- Android ```/data/data/net.steampp.app/cache/Logs```
你的日志内容
Your log content
```
-->
@@ -63,7 +53,6 @@ Your log content
<!--
截图可以贴在这里
Screenshots can be posted here
-->
### 🚑 其他信息
-36
View File
@@ -1,36 +0,0 @@
---
name: "Feature request \U0001F451"
about: 对程序的需求或建议 / Suggest an idea for program
title: "\U0001F451[Enhancement] "
labels: enhancement
assignees: ''
---
<!--
发布前请先尝试在 Issuse 内搜索一下你的 Feature 是否已经被提出过,
别忘了填写标题,标题要简短的描述 Feature
Before publishing, please try to search in issue to see if your feature has been proposed,
Don't forget to fill in the title, which should briefly describe the feature
-->
### 🥰 需求描述(Description)
<!--
详细地描述需求,让大家都能理解
Describe the requirements in detail so that everyone can understand them
-->
### 🧐 解决方案(Solution)
<!--
如果你有解决方案,在这里清晰地阐述
If you have a solution, explain it clearly here
-->
### 🚑 其他信息(Other Information)
<!--
如截图等其他信息可以贴在这里
Other information such as screenshots can be posted here
-->
-17
View File
@@ -1,17 +0,0 @@
---
name: Milestone
about: Issue a summary of the fixes recorded for the next release
title: "vTBD Milestone"
labels: documentation
assignees: rmbadmin, AigioL, Mossimos
---
## New release previous preparations | 发行新版本前准备工作
- [ ] Translate resx | 翻译 resx
- [ ] Compile msixupload package | 编译 msixupload 包
- [ ] Github release / Gitee release | 在 Github 与 Gitee 上发布
- [ ] Upload network disk | 上传网盘
- [ ] Update the official website | 更新官网
- [ ] Server publishing tool enable new version | 服务器发布工具启用新版本
- [ ] ~~Enable MS store channel new version notification after waiting for MS store approval | 等待微软商店审核完成后启用该渠道新版本通知~~
-26
View File
@@ -1,26 +0,0 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
time: "07:00"
timezone: "Asia/Shanghai"
labels:
- "automatic"
open-pull-requests-limit: 99
- package-ecosystem: "gitsubmodule"
directory: "/"
schedule:
interval: "daily"
time: "07:30"
timezone: "Asia/Shanghai"
labels:
- "automatic"
- "dependencies"
open-pull-requests-limit: 99
+2 -4
View File
@@ -3,8 +3,6 @@ on:
push:
branches:
- v3.x
- develop
- main
tags:
- "*"
pull_request:
@@ -33,7 +31,7 @@ jobs:
- name: Setup .NET
if: ${{ matrix.os != 'aigio-win10ltsc-vm' }}
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v2
with:
dotnet-version: 7.0.x
@@ -62,7 +60,7 @@ jobs:
# run: dotnet workload install wasm-tools
- name: Restore Workload
run: dotnet workload restore src\BD.WTTS.Client.Avalonia.App\BD.WTTS.Client.Avalonia.App.csproj
run: dotnet workload restore
- name: Verify dotnet info
run: dotnet --info
-193
View File
@@ -1,193 +0,0 @@
name: Build
env:
ProjectName: Steam++
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
configuration: [ Debug, Release ]
# os: [ windows-latest, macOS-latest, ubuntu-latest ]
os: [ windows-latest, macOS-latest ]
# rid: [ fd-win-x64, win-x64, osx-x64, linux-x64,linux-arm64 ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET 6
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Install macOS SDK(macOS)
if: matrix.os == 'macOS-latest'
run: sudo dotnet workload install macos
- name: Install macOS SDK(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install macos
- name: Install Android SDK(Unix)
if: ${{ matrix.os == 'macOS-latest' || matrix.os == 'ubuntu-latest' }}
run: sudo dotnet workload install android
- name: Install Android SDK(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install android
- name: Install Maui(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install maui
- name: Install Maui(Unix)
# if: ${{ matrix.os == 'macOS-latest' || matrix.os == 'ubuntu-latest' }}
if: matrix.os == 'macOS-latest'
run: sudo dotnet workload install maui
- name: Verify dotnet info
run: dotnet --info
- name: Checkout Credentials repository
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/checkout@v3
with:
repository: SteamTools-Team/Credentials
token: ${{ secrets.REPO_TOKEN }}
path: ./Credentials
- name: Copy pfx and snk To Source
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
run: |
copy ".\Credentials\*.pfx" .
copy ".\Credentials\*.snk" .
dir *.pfx -s
- name: dotnet restore SteamToolsV2+.sln
if: matrix.os == 'windows-latest'
run: dotnet restore ./SteamToolsV2+.sln
- name: dotnet restore SteamToolsV2+.Linux.sln
if: matrix.os == 'ubuntu-latest'
run: dotnet restore ./SteamToolsV2+.Linux.slnf
- name: dotnet restore SteamToolsV2+.Mac.sln
if: matrix.os == 'macOS-latest'
run: dotnet restore ./SteamToolsV2+.Mac.slnf
- name: Build AvaloniaApp ${{ matrix.configuration }}
run: dotnet build ./src/ST.Client.Desktop.Avalonia.App/ST.Client.Avalonia.App.csproj -c "${{ matrix.configuration }}"
- name: Run CommonUnit
run: dotnet test ./tests/Common.UnitTest/Common.UnitTest.csproj -c "${{ matrix.configuration }}"
- name: Run ST.Client.UnitTest
run: dotnet test ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj -c "${{ matrix.configuration }}"
- name: Run ST.Client.Desktop.UnitTest
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj -c "${{ matrix.configuration }}"
- name: dotnet ST.Client.Desktop.UnitTest test
if: matrix.os != 'windows-latest'
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
- name: Get Short CommitId
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
shell: pwsh
run: Write-Output "GITHUB_SHA_SHORT=$(${env:GITHUB_SHA}.Substring(0,7))" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Build ST.Tools.Publish Release
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
run: dotnet build ./src/ST.Tools.Publish/ST.Tools.Publish.csproj -c Release
- name: Build ${{ matrix.configuration }} & Package All
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
shell: pwsh
run: .\packaging\build.ps1 -configuration ${{ matrix.configuration }}
- name: All Package
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
shell: pwsh
run: |
$dev = $(if ('${{ matrix.configuration }}' -eq 'Debug') {"-dev"})
$pexe=".\src\ST.Tools.Publish\bin\Release\net6.0\p.exe"
& $pexe hp $dev
& $pexe sta $dev
& $pexe 7z -buildpackage ${env:GITHUB_SHA_SHORT} $dev
- name: Upload fd-win-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x64_fde_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x64_fde_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload win-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x64_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload fd-win-x86 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x86_fde_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x86_fde_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload win-x86 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x86_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x86_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload macos-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_macos_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_macos_x64_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload macos-arm64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_macos_arm64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_macos_arm64_${{ env.GITHUB_SHA_SHORT }}.7z
- name: Upload linux-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_linux_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_linux_x64_${{ env.GITHUB_SHA_SHORT }}.tar.zst
- name: Upload linux-arm64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_linux_arm64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_linux_arm64_${{ env.GITHUB_SHA_SHORT }}.tar.zst
-382
View File
@@ -1,382 +0,0 @@
name: Publish
env:
ProjectName: Steam++
Configuration: Release
PublishFilePath: C:\PublishFiles
on:
push:
tags:
- '*'
jobs:
Publish:
name: Publish
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ windows-latest ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET 6
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Install macOS SDK(macOS)
if: matrix.os == 'macOS-latest'
run: sudo dotnet workload install macos
- name: Install macOS SDK(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install macos
- name: Install Android SDK(Unix)
if: ${{ matrix.os == 'macOS-latest' || matrix.os == 'ubuntu-latest' }}
run: sudo dotnet workload install android
- name: Install Android SDK(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install android
- name: Install Maui(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install maui
- name: Install Maui(Unix)
# if: ${{ matrix.os == 'macOS-latest' || matrix.os == 'ubuntu-latest' }}
if: matrix.os == 'macOS-latest'
run: sudo dotnet workload install maui
- name: Verify dotnet info
run: dotnet --info
- name: Shell Version
run: sh --version
- name: Checkout NSIS-Build repository
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
uses: actions/checkout@v3
with:
repository: SteamTools-Team/NSIS-Build
token: ${{ secrets.REPO_TOKEN }}
path: ./NSIS-Build
- name: Checkout Credentials repository
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
uses: actions/checkout@v3
with:
repository: SteamTools-Team/Credentials
token: ${{ secrets.REPO_TOKEN }}
path: ./Credentials
- name: Copy pfx and snk To Source
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
run: |
copy ".\Credentials\*.pfx" .
copy ".\Credentials\*.snk" .
dir *.pfx -s
- name: dotnet restore SteamToolsV2+.sln
if: matrix.os == 'windows-latest'
run: dotnet restore ./SteamToolsV2+.sln
- name: dotnet restore SteamToolsV2+.Linux.sln
if: matrix.os == 'ubuntu-latest'
run: dotnet restore ./SteamToolsV2+.Linux.slnf
- name: dotnet restore SteamToolsV2+.Mac.sln
if: matrix.os == 'macOS-latest'
run: dotnet restore ./SteamToolsV2+.Mac.slnf
- name: Build AvaloniaApp
run: dotnet build ./src/ST.Client.Desktop.Avalonia.App/ST.Client.Avalonia.App.csproj -c "${{ env.Configuration }}"
- name: Run CommonUnit
run: dotnet test ./tests/Common.UnitTest/Common.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Run ST.Client.UnitTest
run: dotnet test ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Run ST.Client.Desktop.UnitTest
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Get tag
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
id: tag
uses: dawidd6/action-get-tag@v1
- name: Build ST.Tools.Publish Release
run: dotnet build ./src/ST.Tools.Publish/ST.Tools.Publish.csproj -c Release
- name: Build Release & Package All & Publish Server
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: .\packaging\build.ps1 -version ${{ steps.tag.outputs.tag }} -configuration ${{ env.Configuration }} -isPublish $true
env:
Token: ${{ secrets.PUBLISH_TOKEN }}
WIN_SIGN_PFX_PWD: ${{ secrets.WIN_SIGN_PFX_PWD }}
- name: Package fd-win-x64 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x64_fde_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "fd_win_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x64_fde_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package fd-win-x64 exe
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x64_fde_v${{ steps.tag.outputs.tag }}.exe" "${env:PublishFilePath}"
Write-Output "exe_fd_win_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x64_fde_v${{ steps.tag.outputs.tag }}.exe)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package win-x64 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x64_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "win_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x64_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package win-x64 exe
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x64_v${{ steps.tag.outputs.tag }}.exe" "${env:PublishFilePath}"
Write-Output "exe_win_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x64_v${{ steps.tag.outputs.tag }}.exe)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package fd-win-x86 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x86_fde_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "fd_win_x86_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x86_fde_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package fd-win-x86 exe
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x86_fde_v${{ steps.tag.outputs.tag }}.exe" "${env:PublishFilePath}"
Write-Output "exe_fd_win_x86_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x86_fde_v${{ steps.tag.outputs.tag }}.exe)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package win-x86 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x86_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "win_x86_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x86_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package win-x86 exe
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_win_x86_v${{ steps.tag.outputs.tag }}.exe" "${env:PublishFilePath}"
Write-Output "exe_win_x86_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_win_x86_v${{ steps.tag.outputs.tag }}.exe)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package osx-x64 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_macos_x64_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "macos_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_macos_x64_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package osx-arm64 7z
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_macos_arm64_v${{ steps.tag.outputs.tag }}.7z" "${env:PublishFilePath}"
Write-Output "macos_arm64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_macos_arm64_v${{ steps.tag.outputs.tag }}.7z)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-x64 tar.zst
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.tar.zst" "${env:PublishFilePath}"
Write-Output "linux_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.tar.zst)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-arm64 tar.zst
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.tar.zst" "${env:PublishFilePath}"
Write-Output "linux_arm64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.tar.zst)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-x64 deb
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.deb" "${env:PublishFilePath}"
Write-Output "deb_linux_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.deb)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-arm64 deb
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.deb" "${env:PublishFilePath}"
Write-Output "deb_linux_arm64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.deb)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-x64 rpm
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.rpm" "${env:PublishFilePath}"
Write-Output "rpm_linux_x64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_x64_v${{ steps.tag.outputs.tag }}.rpm)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Package linux-arm64 rpm
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
shell: pwsh
run: |
New-Item -ItemType Directory -Path ${env:PublishFilePath} -Force > $null
Copy-Item ".\src\ST.Client.Desktop.Avalonia.App\bin\${env:Configuration}\Publish\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.rpm" "${env:PublishFilePath}"
Write-Output "rpm_linux_arm64_SHA256=$(.\packaging\SHA256.ps1 ${env:PublishFilePath}\${env:ProjectName}_linux_arm64_v${{ steps.tag.outputs.tag }}.rpm)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Changelog
uses: glennawatson/ChangeLog@v1
id: changelog
- name: Create a new GitHub release
uses: ncipollo/release-action@v1
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
name: ${{ steps.tag.outputs.tag }}
prerelease: false
draft: true
artifacts: ${{ env.PublishFilePath }}\*
body: |
## 版本亮点
* 此版本由 GitHub Action 自动化部署发布,更新日志会在一段时间后手动更新。
${{ steps.changelog.outputs.commitLog }}
## 文件校验
| File | Checksum (SHA256) |
| :- | :- |
| <sub>${{ env.ProjectName }}_win_x64_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.win_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x64_fde_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.fd_win_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x64_v${{ steps.tag.outputs.tag }}.exe</sub> | <sub>${{ env.exe_win_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x64_fde_v${{ steps.tag.outputs.tag }}.exe</sub> | <sub>${{ env.exe_fd_win_x64_SHA256 }}</sub> |
|||
| <sub>${{ env.ProjectName }}_win_x86_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.win_x86_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x86_fde_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.fd_win_x86_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x86_v${{ steps.tag.outputs.tag }}.exe</sub> | <sub>${{ env.exe_win_x86_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_win_x86_fde_v${{ steps.tag.outputs.tag }}.exe</sub> | <sub>${{ env.exe_fd_win_x86_SHA256 }}</sub> |
|||
| <sub>${{ env.ProjectName }}_linux_x64_v${{ steps.tag.outputs.tag }}.tar.zst</sub> | <sub>${{ env.linux_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_linux_arm64_v${{ steps.tag.outputs.tag }}.tar.zst</sub> | <sub>${{ env.linux_arm64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_linux_x64_v${{ steps.tag.outputs.tag }}.deb</sub> | <sub>${{ env.deb_linux_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_linux_arm64_v${{ steps.tag.outputs.tag }}.deb</sub> | <sub>${{ env.deb_linux_arm64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_linux_x64_v${{ steps.tag.outputs.tag }}.rpm</sub> | <sub>${{ env.rpm_linux_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_linux_arm64_v${{ steps.tag.outputs.tag }}.rpm</sub> | <sub>${{ env.rpm_linux_arm64_SHA256 }}</sub> |
|||
| <sub>${{ env.ProjectName }}_macos_x64_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.macos_x64_SHA256 }}</sub> |
| <sub>${{ env.ProjectName }}_macos_arm64_v${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.macos_arm64_SHA256 }}</sub> |
[![WebSite steampp.net](https://img.shields.io/badge/WebSite-steampp.net-brightgreen.svg?style=flat-square&color=61dafb)](https://steampp.net)
[![${{ env.ProjectName }} v${{ steps.tag.outputs.tag }}](https://img.shields.io/badge/${{ env.ProjectName }}-v${{ steps.tag.outputs.tag }}-brightgreen.svg?style=flat-square&color=512bd4)]()
##### [不知道该下载哪个文件?](https://github.com/BeyondDimension/SteamTools/blob/develop/download-guide.md)
WindowsStore:
name: WindowsStore Publish
runs-on: ${{ matrix.os }}
if: ${{ false }} #未做完暂时禁用
strategy:
fail-fast: false
matrix:
os: [ windows-latest ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET 6
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Add msbuild to PATH
if: matrix.os == 'windows-latest'
uses: microsoft/setup-msbuild@v1.3
- name: Verify dotnet info
run: |
dotnet --info
msbuild --version
- name: dotnet restore SteamToolsV2+.sln
if: matrix.os == 'windows-latest'
run: dotnet restore ./SteamToolsV2+.sln
- name: dotnet restore SteamToolsV2+.Linux.sln
if: matrix.os == 'ubuntu-latest'
run: dotnet restore ./SteamToolsV2+.Linux.slnf
- name: dotnet restore SteamToolsV2+.Mac.sln
if: matrix.os == 'macOS-latest'
run: dotnet restore ./SteamToolsV2+.Mac.slnf
- name: Build AvaloniaApp
run: dotnet build ./src/ST.Client.Desktop.Avalonia.App/ST.Client.Avalonia.App.csproj -c "${{ env.Configuration }}"
- name: Run CommonUnit
run: dotnet test ./tests/Common.UnitTest/Common.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Run ST.Client.UnitTest
run: dotnet test ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Run ST.Client.Desktop.UnitTest
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj -c "${{ env.Configuration }}"
- name: Get tag
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
id: tag
uses: dawidd6/action-get-tag@v1
- name: Checkout Credentials repository
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
uses: actions/checkout@v3
with:
repository: SteamTools-Team/Credentials
token: ${{ secrets.REPO_TOKEN }}
path: ./Credentials
- name: Copy pfx and snk To Source
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
run: |
copy ".\Credentials\*.pfx" .
copy ".\Credentials\*.snk" .
dir *.pfx -s
#- name: Build MSIX Package
# run: msbuild .\src\ST.Client.Desktop.Avalonia.App.Bridge.Package\ST.Client.Avalonia.App.Bridge.Package.wapproj /t:rebuild /p:Platform=x64 /p:AppxBundlePlatforms="x64" /p:AppxBundle=Always /p:configuration="release" /t:Publish /p:UapAppxPackageBuildMode=StoreUpload
-21
View File
@@ -1,21 +0,0 @@
name: Sync To Gitee
on:
push:
branches: [ main, develop, www ]
delete:
branches: [ main, develop, www ]
create:
branches: [ main, develop, www ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
with:
source-repo: "git@github.com:BeyondDimension/SteamTools.git"
destination-repo: "git@gitee.com:rmbgame/SteamTools"
-87
View File
@@ -1,87 +0,0 @@
name: Build Xamarin app
#https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-xamarin-applications
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
configuration: [ Debug, Release ]
os: [ macOS-latest ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET 6
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Add msbuild to PATH
if: matrix.os == 'windows-latest'
uses: microsoft/setup-msbuild@v1.3
# - name: Install macOS SDK(macOS)
# if: matrix.os == 'macOS-latest'
# run: sudo dotnet workload install macos
# - name: Install macOS SDK(Windows)
# if: matrix.os == 'windows-latest'
# run: dotnet workload install macos
# - name: Install Maui(Windows)
# if: matrix.os == 'windows-latest'
# run: dotnet workload install maui
- name: Verify dotnet info
run: |
nuget help
dotnet --info
msbuild -version
# - name: Install dependencies
# run: nuget restore ./SteamToolsV2+.sln
- name: Setup Xamarin
uses: maxim-lobanov/setup-xamarin@v1
with:
# mono-version: '6.12' # specify version in '<major>.<minor>' format
# xamarin-ios-version: '14.14' # specify version in '<major>' format
# xamarin-mac-version: latest # specify 'latest' keyword to pick up the latest available version
xamarin-android-version: '11.2' # specify full version; it is not recomended option because your pipeline can be broken suddenly in future
# xcode-version: '12.x' # set the latest available Xcode 12
- name: Setup Android NDK
uses: nttld/setup-ndk@v1.2.0
id: setup-ndk
with:
ndk-version: r21e
add-to-path: false
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
- name: dotnet restore SteamToolsV2+.Mac.slnf
run: dotnet restore ./SteamToolsV2+.Mac.slnf
# - name: Build ST.Client
# run: dotnet msbuild ./src/ST.Client/ST.Client.csproj /p:Configuration=${{ matrix.configuration }}
- name: Build ST.Client.XamarinForms
run: dotnet msbuild ./src/ST.Client.XamarinForms/ST.Client.XamarinForms.csproj /p:Configuration=${{ matrix.configuration }}
- name: Build Android app
run: msbuild ./src/ST.Client.Mobile.Droid.App/ST.Client.Android.App.csproj /t:PackageForAndroid /p:Configuration=${{ matrix.configuration }}
#- name: Build iOS app
# run: msbuild <csproj_file_path> /p:Configuration=${{ matrix.configuration }} /p:Platform=iPhoneSimulator /t:Rebuild
-3
View File
@@ -34,6 +34,3 @@
[submodule "ref/WinAuth"]
path = ref/WinAuth
url = https://github.com/BeyondDimension/WinAuth.git
[submodule "ref/Facepunch.Steamworks"]
path = ref/Facepunch.Steamworks
url = https://github.com/BeyondDimension/Facepunch.Steamworks.git
+80 -8
View File
@@ -54,9 +54,9 @@ See details [./doc/download-guide.en.md](./doc/download-guide.en.md)
- Windows 11
- Windows 10 version 1809(OS internal version 17763) or higher is required
- macOS 10.15 or higher is required
- Ubuntu 20.04 or higher is required
- Debian 11 or higher is required
- Fedora 37 or higher is required
- Ubuntu 18.04 or higher is required
- Debian 10 or higher is required
- CentOS 7 or higher is required
- Deepin(UOS) 20 or higher is required
- ~~iOS 11 or higher is required~~(In development…)
- Android 5.0(API 21) or higher is required
@@ -79,8 +79,80 @@ Read what we [milestones](https://github.com/BeyondDimension/SteamTools/mileston
[Android Studio Electric Eel Or Higher](https://developer.android.com/studio)
[Xcode 14 Or Higher](https://developer.apple.com/xcode)
## 🏗️ Project Structure
See details&nbsp;&nbsp;[./src/README.md](./src/README.md)
## 📄 Open Source Library
See details&nbsp;&nbsp;[./doc/open-source-library.md](./doc/open-source-library.md)
## 📄 Thanks to the following Open Source Projects
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
* [System.Reactive](https://github.com/dotnet/reactive)
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
* [YARP](https://github.com/microsoft/reverse-proxy)
* [FastGithub](https://github.com/dotnetcore/FastGithub)
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
* [WinAuth](https://github.com/winauth/winauth)
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
* [Polly](https://github.com/App-vNext/Polly)
* [TaskScheduler](https://github.com/dahall/taskscheduler)
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
* [NLog](https://github.com/nlog/NLog)
* [NUnit](https://github.com/nunit/nunit)
* [ReactiveUI](https://github.com/reactiveui/reactiveui)
* [MessageBox.Avalonia](https://github.com/AvaloniaUtils/MessageBox.Avalonia)
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
* [APNG.NET](https://github.com/jz5/APNG.NET)
* [Moq](https://github.com/moq/moq4)
* [NPOI](https://github.com/nissl-lab/npoi)
* [Fleck](https://github.com/statianzo/Fleck)
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
* [QRCoder](https://github.com/codebude/QRCoder)
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
* [React](https://github.com/facebook/react)
* [Ant Design](https://github.com/ant-design/ant-design)
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
* [Picasso](https://github.com/square/picasso)
* [OkHttp](https://github.com/square/okhttp)
* [Material Components for Android](https://github.com/material-components/material-components-android)
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
* [Android Jetpack](https://github.com/androidx/androidx)
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
* [Entity Framework Core](https://github.com/dotnet/efcore)
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
* [Windows Forms](https://github.com/dotnet/winforms)
* [Windows Presentation Foundation (WPF)](https://github.com/dotnet/wpf)
* [C#/WinRT](https://github.com/microsoft/CsWinRT)
* [command-line-api](https://github.com/dotnet/command-line-api)
* [.NET Runtime](https://github.com/dotnet/runtime)
* [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons)
* [Material design icons](https://github.com/google/material-design-icons)
+95 -25
View File
@@ -5,7 +5,7 @@
[English](./README.en.md) | 简体中文
「Watt Toolkit」是一个开源跨平台的多功能游戏工具箱,此工具的大部分功能都是需要您下载安装 Steam 才能使用。
![Release Download](https://img.shields.io/github/downloads/BeyondDimension/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/releases/latest)
[![GitHub license](https://img.shields.io/github/license/BeyondDimension/SteamTools?style=flat-square)](LICENSE)
@@ -30,7 +30,6 @@
</div>
## 🚀 下载渠道
- [![Steam 商店](./res/brands/steam.jpg)](https://store.steampowered.com/app/2425030)
- [![Microsoft 应用商店](./res/brands/msstore.en.png)](https://apps.microsoft.com/store/detail/watt-toolkit/9MTCFHS560NG?hl=zh-cn&gl=cn)
- [软件官网](https://steampp.net)
- [GitHub 发行版](https://github.com/BeyondDimension/SteamTools/releases)
@@ -42,23 +41,22 @@
详见 [./doc/download-guide.md](./doc/download-guide.md)
## ✨ 功能
全新的 3.0 版本,支持自定义插件功能,以下功能为下载时自带的默认插件,可以自行删除或禁用。
1. 网络加速 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- ~~使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代来支持更快的访问游戏网站。~~
- 使用 [YARP.ReverseProxy](https://github.com/microsoft/reverse-proxy) 开源项目进行本地反代来支持更快的访问游戏网站。
2. 脚本配置 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 通过加速服务拦截网络请求将一些 JS 脚本注入在网页中,提供类似网页插件的功能。
3. 账号切换 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 快速切换已在当前 PC 上登录过的 Steam、Epic、Uplay 等等多平台账号,与管理 Steam 家庭共享库排序及禁用等功能。
4. 库存游戏 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 直接管理你的 Steam 游戏库存,可以编辑游戏名称和[自定义封面](https://www.steamgriddb.com)。
- 一键切换已在当前 PC 上登录过的 Steam 账号,与管理家庭共享库排序及禁用等功能。
4. 库存管理 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 让您直接管理 Steam 游戏库存,可以编辑游戏名称和[自定义封面](https://www.steamgriddb.com),也能解锁以及反解锁 Steam 游戏成就。
- 监控 Steam 游戏下载进度实现 Steam 游戏下载完成定时关机功能。
- 模拟运行 Steam 游戏,让您不用安装和下载对应的游戏也能挂游玩时间和掉落 Steam 卡片
- 自助管理 Steam 游戏云存档,随时删除和上传自定义的存档文件至 Steam 云。
- 解锁以及反解锁 Steam 游戏成就。
- 模拟运行 Steam 游戏,让您不用安装和下载对应的游戏也能挂游玩时间和 Steam 卡片
- 自助管理 Steam 游戏云存档,随时删除和上传自定义的存档文件至 Steam 云
5. 本地令牌 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- 让您的手机令牌统一保存在电脑中、支持通用HOTP、TOTP、Steam、Google 等令牌导入。
- 支持 Steam 登录账号自定绑定生成令牌、支持 Steam 批量确认交易功能。
6. ~~自动挂卡(新版本开发中)~~ <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- ~~集成 [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) 在应用内提供 挂机掉落 Steam 集换式卡牌 等功能。~~
- 让您的手机令牌统一保存在电脑中,目前仅支持 Steam 令牌,后续会开发支持更多的令牌种类与云同步令牌。
6. 自动挂卡 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- 集成 [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) 在应用内提供 挂机掉落 Steam 集换式卡牌 等功能。
7. 游戏工具 <img src="./res/brands/windows.svg" width="16" height="16" />
- 强制游戏窗口使用无边框窗口化、更多功能待开发。
@@ -66,9 +64,9 @@
- Windows 11
- Windows 10 版本 1809(OS 内部版本 17763)或更高版本
- macOS 10.15 或更高版本
- Ubuntu 20.04 或更高版本
- Debian 11 或更高版本
- Fedora 37 或更高版本
- Ubuntu 18.04 或更高版本
- Debian 10 或更高版本
- CentOS 7 或更高版本
- Deepin(UOS) 20 或更高版本
- ~~iOS 11 或更高版本~~(开发中…)
- Android 5.0(API 21) 或更高版本
@@ -76,12 +74,8 @@
## 🧩 截图
<img src="./res/screenshots/screenshot-windows-accelerator.webp" width="800" />
<br/>
<img src="./res/screenshots/screenshot-windows-gameaccount.webp" width="800" />
<br/>
<img src="./res/screenshots/screenshot-windows-gamelist.webp" width="800" />
<br/>
<br/>
<!--<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />-->
<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />
## 从移动端 Steam App 导入令牌指南
- [Android 添加本地令牌(Xposed)](https://github.com/BeyondDimension/SteamTools/issues/2276)
@@ -107,7 +101,7 @@
- 单个组件
- GitHub Extension for Visual Studio(可选)
- [Visual Studio Marketplace](https://marketplace.visualstudio.com)
- [Avalonia for Visual Studio(可选)](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaVS)
- [Avalonia for Visual Studio(可选)](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
- [NUnit VS Templates(可选)](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
[JetBrains Rider](https://www.jetbrains.com/rider)
@@ -117,7 +111,7 @@
[Xcode 14 或更高版本](https://developer.apple.com/xcode)
## 🏗️ [项目结构](./src/README.md)
详见&nbsp;&nbsp;[./src/README.md](./src/README.md)
详见 [./src/README.md](./src/README.md)
## 🧑‍💼 加入我们
- [.NET/C# 高级软件工程师(客户端方向)](https://www.zhipin.com/job_detail/b271a34a3efeb84c1XJ_2dW6ElVT.html)
@@ -128,5 +122,81 @@
- [高级 Web 前端工程师](https://www.zhipin.com/job_detail/e59317c527f3f49e1XJ92d24FVRV.html)
-->
## 📄 [开源代码库](./doc/open-source-library.md)
详见&nbsp;&nbsp;[./doc/open-source-library.md](./doc/open-source-library.md)
<!--👇图标如果发生更改,还需更改 Tools.OpenSourceLibraryList(Program.OpenSourceLibraryListEmoji) -->
## 📄 感谢以下开源项目
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
* [System.Reactive](https://github.com/dotnet/reactive)
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
* [YARP](https://github.com/microsoft/reverse-proxy)
* [FastGithub](https://github.com/dotnetcore/FastGithub)
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
* [WinAuth](https://github.com/winauth/winauth)
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
* [Polly](https://github.com/App-vNext/Polly)
* [TaskScheduler](https://github.com/dahall/taskscheduler)
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
* [NLog](https://github.com/nlog/NLog)
* [NUnit](https://github.com/nunit/nunit)
* [ReactiveUI](https://github.com/reactiveui/reactiveui)
* [MessageBox.Avalonia](https://github.com/AvaloniaUtils/MessageBox.Avalonia)
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
* [APNG.NET](https://github.com/jz5/APNG.NET)
* [Moq](https://github.com/moq/moq4)
* [NPOI](https://github.com/nissl-lab/npoi)
* [Fleck](https://github.com/statianzo/Fleck)
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
* [QRCoder](https://github.com/codebude/QRCoder)
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
* [React](https://github.com/facebook/react)
* [Ant Design](https://github.com/ant-design/ant-design)
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
* [Picasso](https://github.com/square/picasso)
* [OkHttp](https://github.com/square/okhttp)
* [Material Components for Android](https://github.com/material-components/material-components-android)
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
* [Android Jetpack](https://github.com/androidx/androidx)
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
* [Entity Framework Core](https://github.com/dotnet/efcore)
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
* [Windows Forms](https://github.com/dotnet/winforms)
* [Windows Presentation Foundation (WPF)](https://github.com/dotnet/wpf)
* [C#/WinRT](https://github.com/microsoft/CsWinRT)
* [command-line-api](https://github.com/dotnet/command-line-api)
* [.NET Runtime](https://github.com/dotnet/runtime)
* [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons)
* [Material design icons](https://github.com/google/material-design-icons)
+21 -908
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
-17
View File
@@ -1,17 +0,0 @@
#!/bin/bash
run_path=$(dirname "$0")
dotnet_path="$run_path/dotnet"
dotnet_exec="$dotnet_path/dotnet"
export DOTNET_ROOT="$dotnet_path"
link_exec="$run_path/Steam++"
# 判断符号链接是否存在
if [ -L "$link_exec" ]; then
echo "符号链接 $link_exec 已存在"
else
rm -rf "$link_exec" 2>/dev/null
echo "创建符号链接 $dotnet_exec 到 $link_exec"
ln -s "$dotnet_exec" "$link_exec"
chmod +x "$link_exec"
fi
"$link_exec" "$run_path/assemblies/Steam++.dll" "$@"
exit
-58
View File
@@ -1,58 +0,0 @@
#!/bin/bash
base_path="$HOME/WattToolkit"
export LC_ALL=en_US.UTF-8
if [ "$1" = "-c" ]; then
# 只验证 certutil 是否可用
if command -v certutil &>/dev/null; then
exit 200
else
echo "请手动安装 certutil 工具。"
exit 1
fi
else
Install_certutil() {
# 判断发行版类型
if command -v certutil &>/dev/null; then
echo "certutil 工具已安装。"
else
echo "证书导入以及验证需要使用 certutil 工具。"
# 判断包管理器
if command -v apt &>/dev/null; then
# 使用 apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y libnss3-tools
elif command -v dnf &>/dev/null; then
# 使用 dnf (Fedora)
sudo dnf install -y nss-tools
elif command -v yum &>/dev/null; then
# 使用 yum (CentOS/Red Hat)
sudo yum install -y nss-tools
elif command -v pacman &>/dev/null; then
# 使用 pacman (Arch Linux)
# sudo pacman -S nss
echo "请手动安装 certutil 工具。"
exit 1
else
echo "请手动安装 certutil 工具。"
exit 1
fi
echo "certutil 工具已安装。"
fi
}
certutil_Init() {
certutil -d $HOME/.pki/nssdb -L
ret=$?
if [ $ret -ne 0 ]; then
echo "即将初始化 certutil \$HOME/.pki/nssdb"
mkdir -p $HOME/.pki
mkdir -p $HOME/.pki/nssdb
chmod 700 $HOME/.pki/nssdb
certutil -d $HOME/.pki/nssdb -N --empty-password
else
echo "certutil nssdb 正常"
fi
}
Install_certutil
certutil_Init
exit 0
fi
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
#添加桌面文件
run_path=$(dirname "$0")
base_path="$(dirname "$run_path")"
exec_name="Steam++"
rm -rf "$HOME/Desktop/Watt Toolkit.desktop" 2>/dev/null
echo "#!/usr/bin/env xdg-open
[Desktop Entry]
Name=Watt Toolkit
Exec=$base_path/$exec_name.sh
Icon=$base_path/Icons/Watt-Toolkit.png
Terminal=false
Type=Application
StartupNotify=false" >"$HOME/Desktop/Watt Toolkit.desktop"
chmod +x "$HOME/Desktop/Watt Toolkit.desktop"
exit 0
-8
View File
@@ -1,8 +0,0 @@
#!/usr/bin/env xdg-open
[Desktop Entry]
Name=°²×° Watt Toolkit
Exec=curl https://steampp.net/pkg/latest/steamdeck/install.sh | bash -s --
Icon=steamdeck-gaming-return
Terminal=true
Type=Application
StartupNotify=false
-208
View File
@@ -1,208 +0,0 @@
#!/bin/bash
run_path=$(dirname "$0")
base_path="$(dirname "$run_path")"
mkdir -p "$base_path"
cd "$base_path" || exit 1
appVer_path="$base_path/WattToolkit.AppVer"
exec_name="Steam++"
tar_name="WattToolkit.tgz"
tar_path="$base_path/$tar_name"
app_name="Watt Toolkit"
PROCESS_NAMES=("$exec_name" "$app_name")
export LC_ALL=en_US.UTF-8
Install_certutil() {
# 判断发行版类型
if command -v certutil &>/dev/null; then
echo "certutil 工具已安装。"
else
echo "证书导入以及验证需要使用 certutil 工具。"
# 判断包管理器
if command -v apt &>/dev/null; then
# 使用 apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y libnss3-tools
elif command -v dnf &>/dev/null; then
# 使用 dnf (Fedora)
sudo dnf install -y nss-tools
elif command -v yum &>/dev/null; then
# 使用 yum (CentOS/Red Hat)
sudo yum install -y nss-tools
elif command -v pacman &>/dev/null; then
# 使用 pacman (Arch Linux)
# sudo pacman -S nss
echo "请手动安装 certutil 工具。"
exit 1
else
echo "请手动安装 certutil 工具。"
exit 1
fi
echo "certutil 工具已安装。"
fi
}
certutil_Init() {
certutil -d $HOME/.pki/nssdb -L
ret=$?
if [ $ret -ne 0 ]; then
echo "即将初始化 certutil \$HOME/.pki/nssdb"
mkdir -p $HOME/.pki
mkdir -p $HOME/.pki/nssdb
chmod 700 $HOME/.pki/nssdb
certutil -d $HOME/.pki/nssdb -N --empty-password
else
echo "certutil nssdb 正常"
fi
}
Install_jq() {
# Check if jq is already installed
if command -v jq &>/dev/null; then
echo "jq 工具已安装。"
else
echo "jq 用来解析版本更新。"
# Check the package manager
if command -v apt &>/dev/null; then
# Using apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y jq
elif command -v dnf &>/dev/null; then
# Using dnf (Fedora)
sudo dnf install -y jq
elif command -v yum &>/dev/null; then
# Using yum (CentOS/Red Hat)
sudo yum install -y jq
elif command -v pacman &>/dev/null; then
# Using pacman (Arch Linux)
sudo pacman -S jq
else
echo "请手动安装 jq 工具。"
exit 1
fi
echo "请手动安装 jq 工具。"
fi
}
Install_zenity() {
# 判断发行版类型
if command -v zenity &>/dev/null; then
echo "zenity 工具已安装。"
else
echo "安装过程需要 zenity 工具。"
# 判断包管理器
if command -v apt &>/dev/null; then
# 使用 apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y zenity
elif command -v dnf &>/dev/null; then
# 使用 dnf (Fedora)
sudo dnf install -y zenity
elif command -v yum &>/dev/null; then
# 使用 yum (CentOS/Red Hat)
sudo yum install -y zenity
elif command -v pacman &>/dev/null; then
# 使用 pacman (Arch Linux)
# sudo pacman -S zenity
echo "请手动安装 zenity 工具。"
exit 1
else
echo "请手动安装 zenity 工具。"
exit 1
fi
echo "zenity 工具已安装。"
fi
}
Show_Run() {
local param1=$1
# 显示提示框,询问是否运行程序
zenity --question --text="$1" --width=400
# 获取上一个命令的退出码
response=$?
if [ $response -eq 0 ]; then
echo "程序已启动。"
exit 0 &
# 用户点击了 "运行" 按钮,启动程序
/bin/sh -c "$base_path/$exec_name.sh"
else
# 用户点击了 "关闭" 按钮,退出脚本
exit 0
fi
}
Kill_Process() {
# 尝试的次数
Kill_MAX_RETRIES=3
# 循环尝试终止进程
for process_name in "${PROCESS_NAMES[@]}"; do
kill_retry=1
while [ $kill_retry -le $Kill_MAX_RETRIES ]; do
pid=$(pgrep "$process_name")
if [ -n "$pid" ]; then
echo "尝试 $kill_retry: 进程 $process_name 正在运行中。正在终止..."
kill $pid
sleep 2
else
break
fi
kill_retry=$((kill_retry + 1))
done
done
for process_name in "${PROCESS_NAMES[@]}"; do
# 检查是否成功终止进程
if pgrep -x "$process_name" >/dev/null; then
echo "无法终止程序 $process_name。尝试次数已达上限。"
exit 1
else
echo "程序 $process_name 已成功终止。"
fi
done
}
Install_certutil
Install_zenity
Install_jq
certutil_Init
Kill_Process
dotnet_exec="$dotnet_path/dotnet/dotnet"
if [ -x "$dotnet_exec" ]; then
echo "文件具有执行权限。"
else
chmod +x "$dotnet_exec"
fi
chmod +x "$base_path/$exec_name.sh"
# xdg-icon-resource install "$base_path/Icons/Watt-Toolkit.png" --size 128 Watt-Toolkit
InitDesktop() {
while true; do
# 使用 zenity 提示用户选择安装路径或使用默认路径
choice=$(zenity --list --radiolist --title="请选择要添加到的位置" --column="选择" --column="路径" TRUE "$HOME/.local/share/applications/" FALSE "$HOME/Desktop")
# 检查用户输入
if [ "$choice" == "$HOME/.local/share/applications/" ]; then
target_dir="$HOME/.local/share/applications/"
break
elif [ "$choice" == "$HOME/Desktop" ]; then
target_dir="$HOME/Desktop/"
break
else
echo "无效选项,请输入 1 或 2。"
fi
done
#添加桌面文件
rm -rf "$target_dir/Watt Toolkit.desktop" 2>/dev/null
echo "#!/usr/bin/env xdg-open
[Desktop Entry]
Name=Watt Toolkit
Exec=$base_path/$exec_name.sh
Icon=$base_path/Icons/Watt-Toolkit.png
Terminal=false
Type=Application
StartupNotify=false" >"$target_dir/Watt Toolkit.desktop"
chmod +x "$target_dir/Watt Toolkit.desktop"
}
InitDesktop
# update-desktop-database ~/.local/share/applications
#运行程序
Show_Run "下载安装完成,是否启动程序?"
exit 0
-393
View File
@@ -1,393 +0,0 @@
#!/bin/bash
# 设置默认的 base_path 参数
default_base_path="$HOME/WattToolkit"
base_path="$default_base_path"
# 循环直到用户输入有效路径或直接回车
while true; do
# 使用 zenity 提示用户选择安装路径或使用默认路径
custom_base_path=$(zenity --entry --title="安装路径" --text="请输入安装路径(默认为 $default_base_path,不输入则使用默认路径)")
# 如果用户提供了自定义路径,则使用该路径
if [ -n "$custom_base_path" ]; then
base_path="$custom_base_path"
break
elif [ -z "$custom_base_path" ]; then
# 用户直接回车,使用默认路径
break
else
# 用户输入无效路径,重新提示
echo "无效路径,请重新输入。"
fi
done
# 创建安装路径
mkdir -p "$base_path" || {
echo "无法创建安装路径 $base_path,请检查权限或路径是否正确。"
exit 1
}
# 切换到安装路径
cd "$base_path" || {
echo "无法切换到安装路径 $base_path,请检查权限或路径是否正确。"
exit 1
}
appVer_path="$base_path/WattToolkit.AppVer"
exec_name="Steam++"
tar_name="WattToolkit.tgz"
tar_path="$base_path/$tar_name"
base_url="https://api.steampp.net"
architecture=1
app_name="Watt Toolkit"
PROCESS_NAMES=("$exec_name" "$app_name")
export LC_ALL=en_US.UTF-8
Install_certutil() {
# 判断发行版类型
if command -v certutil &>/dev/null; then
echo "certutil 工具已安装。"
else
echo "证书导入以及验证需要使用 certutil 工具。"
# 判断包管理器
if command -v apt &>/dev/null; then
# 使用 apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y libnss3-tools
elif command -v dnf &>/dev/null; then
# 使用 dnf (Fedora)
sudo dnf install -y nss-tools
elif command -v yum &>/dev/null; then
# 使用 yum (CentOS/Red Hat)
sudo yum install -y nss-tools
elif command -v pacman &>/dev/null; then
# 使用 pacman (Arch Linux)
# sudo pacman -S nss
echo "请手动安装 certutil 工具。"
exit 1
else
echo "请手动安装 certutil 工具。"
exit 1
fi
echo "certutil 工具已安装。"
fi
}
certutil_Init() {
certutil -d $HOME/.pki/nssdb -L
ret=$?
if [ $ret -ne 0 ]; then
echo "即将初始化 certutil \$HOME/.pki/nssdb"
mkdir -p $HOME/.pki
mkdir -p $HOME/.pki/nssdb
chmod 700 $HOME/.pki/nssdb
certutil -d $HOME/.pki/nssdb -N --empty-password
else
echo "certutil nssdb 正常"
fi
}
Install_jq() {
# Check if jq is already installed
if command -v jq &>/dev/null; then
echo "jq 工具已安装。"
else
echo "jq 用来解析版本更新。"
# Check the package manager
if command -v apt &>/dev/null; then
# Using apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y jq
elif command -v dnf &>/dev/null; then
# Using dnf (Fedora)
sudo dnf install -y jq
elif command -v yum &>/dev/null; then
# Using yum (CentOS/Red Hat)
sudo yum install -y jq
elif command -v pacman &>/dev/null; then
# Using pacman (Arch Linux)
sudo pacman -S jq
else
echo "请手动安装 jq 工具。"
exit 1
fi
echo "请手动安装 jq 工具。"
fi
}
#精简版系统可能没有该工具
Install_zenity() {
# 判断发行版类型
if command -v zenity &>/dev/null; then
echo "zenity 工具已安装。"
else
echo "安装过程需要 zenity 工具。"
# 判断包管理器
if command -v apt &>/dev/null; then
# 使用 apt (Debian/Ubuntu)
sudo apt update
sudo apt install -y zenity
elif command -v dnf &>/dev/null; then
# 使用 dnf (Fedora)
sudo dnf install -y zenity
elif command -v yum &>/dev/null; then
# 使用 yum (CentOS/Red Hat)
sudo yum install -y zenity
elif command -v pacman &>/dev/null; then
# 使用 pacman (Arch Linux)
# sudo pacman -S zenity
echo "请手动安装 zenity 工具。"
exit 1
else
echo "请手动安装 zenity 工具。"
exit 1
fi
echo "zenity 工具已安装。"
fi
}
Show_Run() {
local param1=$1
# 显示提示框,询问是否运行程序
zenity --question --text="$1" --width=400
# 获取上一个命令的退出码
response=$?
if [ $response -eq 0 ]; then
echo "程序已启动。"
exit 0 &
# 用户点击了 "运行" 按钮,启动程序
/bin/sh -c "$base_path/$exec_name.sh"
else
# 用户点击了 "关闭" 按钮,退出脚本
exit 0
fi
}
Get_NewVer() {
#获取系统架构
arch=$(uname -m)
case $arch in
x86_64)
architecture=1
;;
i?86)
architecture=0
;;
arm*)
architecture=2
;;
aarch64)
architecture=3
;;
*)
zenity --info --text="未知的设备架构:$arch!" --width=300
exit 500
;;
esac
# 获取发行版信息
read -r os_version <<<"$(cat /etc/os-release | grep -E 'VERSION_ID=' | awk -F'=' '{ print $2 }' | tr -d '"')"
# 如果 VERSION 为空,则使用 BUILD_ID 填充
if [ -z "$os_version" ]; then
os_version=$(cat /etc/os-release | grep -E 'BUILD_ID=' | awk -F'=' '{ print $2 }' | tr -d '"')
fi
# 分割版本号
IFS='.' read -ra version_parts <<<"$os_version"
# 提取主版本号和次版本号
major_version=${version_parts[0]}
minor_version=${version_parts[1]}
if [ -z "$minor_version" ]; then
minor_version=0
fi
# 通过 SHA384 文件来判断是否需要更新
wget "$base_url/basic/versions/8/16/$architecture/$major_version/$minor_version/-1/0/" -O "$appVer_path" 2>&1
n_sha384=$(jq -r '.["\uD83E\uDD93"].Downloads[0].SHA384' "$appVer_path")
downloads_url=$(jq -r '.["\uD83E\uDD93"].Downloads[0].DownloadUrl' "$appVer_path")
# 检查 SHA384 值是否为空
if [ "$n_sha384" = "" ]; then
zenity --info --text="未知的最新版本 Hash:$n_sha384!" --width=300
exit 500
fi
sleep 1
#本地版本 Hash
o_sha384=$(cat "AppVer")
if [ -e "AppVer" ]; then
if [ "${o_sha384,,}" = "${n_sha384,,}" ]; then
Show_Run "已是最新版本,是否启动程序?"
exit 0
fi
fi
}
Download_File() {
# 删除旧的文件
rm -rf $tar_path
title="安装"
# 检查 o_sha384 是否为空
if [ -z "$o_sha384" ]; then
title="安装"
else
title="更新"
fi
for i in {1..3}; do
#下载文件到目标目录
wget "$downloads_url" -O "$tar_path" 2>&1 | sed -u 's/.* \([0-9]\+%\)\ \+\([0-9.]\+.\) \(.*\)/\1\n# 下载中 \2\/s, 剩余时间: \3/' | zenity --progress --title="$title Watt Toolkit" --auto-close --width=500
RUNNING=0
while [ $RUNNING -eq 0 ]; do
if [ -z "$(pidof zenity)" ]; then
pkill wget
RUNNING=1
fi
sleep 0.1
done
sleep 1
# 校验下载文件 Hash
actual_hash=$(sha384sum "$tar_name" | awk '{ print $1 }')
if [ "${actual_hash,,}" = "${n_sha384,,}" ]; then
rm "AppVer"
echo "${actual_hash,,}" >>"$base_path/AppVer"
break 2
fi
if [ "$i" -ge "3" ]; then
zenity --error --text="下载错误。" --width=500
exit 1
fi
done
}
Kill_Process() {
# 尝试的次数
Kill_MAX_RETRIES=3
# 循环尝试终止进程
for process_name in "${PROCESS_NAMES[@]}"; do
kill_retry=1
while [ $kill_retry -le $Kill_MAX_RETRIES ]; do
pid=$(pgrep "$process_name")
if [ -n "$pid" ]; then
echo "尝试 $kill_retry: 进程 $process_name 正在运行中。正在终止..."
kill $pid
sleep 2
else
break
fi
kill_retry=$((kill_retry + 1))
done
done
for process_name in "${PROCESS_NAMES[@]}"; do
# 检查是否成功终止进程
if pgrep -x "$process_name" >/dev/null; then
echo "无法终止程序 $process_name。尝试次数已达上限。"
exit 1
else
echo "程序 $process_name 已成功终止。"
fi
done
}
Decompression() {
echo "开始解压更新。"
# 使用 zenity 显示进度条对话框,并将解压命令输出重定向到文件
tar -xzvf "$tar_name" 2>&1 |
zenity --progress \
--title="安装中" \
--text="正在解压 $tar_name..." \
--percentage=20 \
--auto-close \
--width=500
# 删除本地版本缓存
rm -f "$appVer_path" &>/dev/null
dotnet_path="$base_path/dotnet"
dotnet_exec="$dotnet_path/dotnet"
if [ -x "$dotnet_exec" ]; then
echo "文件具有执行权限。"
else
chmod +x "$dotnet_exec"
fi
chmod +x "$base_path/$exec_name.sh"
}
#先安装依赖;
Install_certutil
Install_zenity
Install_jq
certutil_Init
#版本检查更新;
Get_NewVer
# 使用条件判断来检查文件是否存在
if [ -f "$tar_path" ]; then
#如果本地存在文件与新版本计算 Hash 避免重复下载;
temp_hash=$(sha384sum "$tar_path" | awk '{ print $1 }')
if [ "${temp_hash,,}" != "${n_sha384,,}" ]; then
#下载文件
Download_File
else
rm "$base_path/AppVer"
#版本号是最新缓存 输出到文件
echo "${temp_hash,,}" >>"$base_path/AppVer"
zenity --question --text="本地已有最新安装包是否继续解压?" --width=400
# 获取上一个命令的退出码
response=$?
if [ $response -eq 0 ]; then
echo "继续解压"
else
# 用户点击了 "关闭" 按钮,退出脚本
exit 0
fi
fi
else
#下载文件
Download_File
fi
#解压前尝试杀死旧版本进程
Kill_Process
#解压
Decompression
# xdg-icon-resource install "$base_path/Icons/Watt-Toolkit.png" --size 128 Watt-Toolkit
InitDesktop() {
while true; do
# 使用 zenity 提示用户选择安装路径或使用默认路径
choice=$(zenity --list --radiolist --title="请选择要添加到的位置" --column="选择" --column="路径" TRUE "$HOME/.local/share/applications/" FALSE "$HOME/Desktop")
# 检查用户输入
if [ "$choice" == "$HOME/.local/share/applications/" ]; then
target_dir="$HOME/.local/share/applications/"
break
elif [ "$choice" == "$HOME/Desktop" ]; then
target_dir="$HOME/Desktop/"
break
else
echo "无效选项,请输入 1 或 2。"
fi
done
#添加桌面文件
rm -rf "$target_dir/Watt Toolkit.desktop" 2>/dev/null
echo "#!/usr/bin/env xdg-open
[Desktop Entry]
Name=Watt Toolkit
Exec=$base_path/$exec_name.sh
Icon=$base_path/Icons/Watt-Toolkit.png
Terminal=false
Type=Application
StartupNotify=false" >"$target_dir/Watt Toolkit.desktop"
chmod +x "$target_dir/Watt Toolkit.desktop"
}
InitDesktop
# update-desktop-database ~/.local/share/applications
#运行程序
Show_Run "下载安装完成,是否启动程序?"
exit 0
-99
View File
@@ -1,99 +0,0 @@
#!/bin/bash
run_path=$(dirname "$0")
base_path="$(dirname "$run_path")"
exec_name="Steam++"
app_name="Watt Toolkit"
AppData="$XDG_DATA_HOME/Steam++"
AppData_t="$HOME/.local/share/Steam++"
Cache="$XDG_CACHE_HOME/Steam++"
Cache_t="$HOME/.cache/Steam+"
PROCESS_NAMES=("$exec_name" "$app_name")
export LC_ALL=en_US.UTF-8
#检查是否存在 Steam++.sh 避免卸载错误
file_to_check="$base_path/Steam++.sh"
folders_to_check=("dotnet" "modules" "native" "script" "assemblies")
if [ -e "$file_to_check" ]; then
echo "文件 $file_to_check 存在"
else
echo "文件 $file_to_check 不存在"
exit 1
fi
for folder in "${folders_to_check[@]}"; do
folder_path="$base_path/$folder"
if [ -d "$folder_path" ]; then
echo "文件夹 $folder_path 存在"
else
echo "文件夹 $folder_path 不存在"
exit 1
fi
done
echo "验证该文件夹是 $app_name 安装目录,请确认是否卸载。"
read -p "所有文件和文件夹都存在,确认卸载吗? (输入 'y' 确认): " confirmation
if [ "${confirmation,,}" == "y" ]; then
echo "开始执行卸载操作"
# 在这里添加您的卸载操作
else
echo "用户取消卸载操作"
exit 0
fi
Kill_Process() {
# 尝试的次数
Kill_MAX_RETRIES=3
# 循环尝试终止进程
for process_name in "${PROCESS_NAMES[@]}"; do
kill_retry=1
while [ $kill_retry -le $Kill_MAX_RETRIES ]; do
pid=$(pgrep "$process_name")
if [ -n "$pid" ]; then
echo "尝试 $kill_retry: 进程 $process_name 正在运行中。正在终止..."
kill $pid
sleep 2
else
break
fi
kill_retry=$((kill_retry + 1))
done
done
for process_name in "${PROCESS_NAMES[@]}"; do
# 检查是否成功终止进程
if pgrep -x "$process_name" >/dev/null; then
echo "无法终止程序 $process_name。尝试次数已达上限。"
exit 1
else
echo "程序 $process_name 已成功终止。"
fi
done
}
Kill_Process
zenity --question --text="是否删除证书?" --width=400
# 获取上一个命令的退出码
delCer=$?
if [ $delCer -eq 0 ]; then
certutil -D -d $HOME/.pki/nssdb -n "SteamTools"
fi
zenity --question --text="是否删除用户数据?" --width=400
# 获取上一个命令的退出码
delUserData=$?
if [ $delUserData -eq 0 ]; then
rm -rf $AppData 2>/dev/null
rm -rf $AppData_t 2>/dev/null
certutil -D -d $HOME/.pki/nssdb -n "SteamTools"
else
echo "保留用户数据方便下次安装。"
echo "如需删除可手动删除该目录:$AppData 或者 $AppData_t"
fi
rm -rf $Cache 2>/dev/null
rm -rf $Cache_t 2>/dev/null
rm -rf $base_path 2>/dev/null
rm -rf "$HOME/Desktop/Watt Toolkit.desktop" 2>/dev/null
zenity --info --text="卸载完成!" --width=300
-96
View File
@@ -1,96 +0,0 @@
#!/bin/bash
# 判断是否提供了 Build_Mode 参数
if [ -z "$1" ]; then
Build_Mode="any" # 如果没有提供参数,则设置默认值为 "any"
else
Build_Mode="$1"
fi
Base_Path="/Users/moxiansheng/Documents/GitHub/SteamTools"
App_Path="$Base_Path/src/BD.WTTS.Client.Avalonia.App"
Publish_Path="bin/Release/Publish/assemblies"
Plugins_Release_Path="bin/Release"
CodesignKey_Name="mossimo code"
App_Modules_Path="$App_Path/$Publish_Path/modules"
echo "编译主程序"
cd "$App_Path"
dotnet publish -c Release -p:PublishDir="$Publish_Path" -f net8.0-macos -p:CreatePackage=false -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
rm -r "$App_Modules_Path"
mkdir -p "$App_Modules_Path"
echo "编译插件"
#复制插件
Copy_Plugins() {
local Plugins_Folder=$1
local Plugins_Folder_Name=$2
local Plugins_FileName=$3
mkdir -p "$App_Modules_Path/$Plugins_Folder_Name"
cp -r "$Plugins_Folder/$Plugins_FileName" "$App_Modules_Path/$Plugins_Folder_Name/$Plugins_FileName"
}
echo "编译加速插件"
Plugins_Accelerator_Path="$Base_Path/src/BD.WTTS.Client.Plugins.Accelerator"
cd "$Plugins_Accelerator_Path"
dotnet publish -c Release -p:PublishDir="$Publish_Path" -f net8.0-macos
Copy_Plugins "$Plugins_Release_Path/net8.0-macos" "Accelerator" "BD.WTTS.Client.Plugins.Accelerator.dll"
Plugins_Accelerator_ReverseProxy_Path="$Base_Path/src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy"
cd "$Plugins_Accelerator_ReverseProxy_Path"
# 根据 Build_Mode 执行不同逻辑
if [ "$Build_Mode" = "any" ]; then
dotnet publish -c Release -p:PublishDir="$Publish_Path/arm64" -f net8.0 -r osx-arm64 -p:PublishSingleFile=true --self-contained -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
dotnet publish -c Release -p:PublishDir="$Publish_Path/x64" -f net8.0 -r osx-x64 -p:PublishSingleFile=true --self-contained -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
lipo -create "$Publish_Path/arm64/Steam++.Accelerator" "$Publish_Path/x64/Steam++.Accelerator" -output "$Publish_Path/Steam++.Accelerator"
Copy_Plugins "$Publish_Path" "Accelerator" "Steam++.Accelerator"
elif [ "$Build_Mode" = "arm64" ]; then
dotnet publish -c Release -p:PublishDir="$Publish_Path/arm64" -f net8.0 -r osx-arm64 -p:PublishSingleFile=true --self-contained -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
Copy_Plugins "$Publish_Path/arm64" "Accelerator" "Steam++.Accelerator"
elif [ "$Build_Mode" = "x64" ]; then
dotnet publish -c Release -p:PublishDir="$Publish_Path/x64" -f net8.0 -r osx-x64 -p:PublishSingleFile=true --self-contained -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
Copy_Plugins "$Publish_Path/x64" "Accelerator" "Steam++.Accelerator"
fi
echo "编译令牌插件"
Plugins_Authenticator_Path="$Base_Path/src/BD.WTTS.Client.Plugins.Authenticator"
cd "$Plugins_Authenticator_Path"
dotnet publish -c Release -p:PublishDir="$Publish_Path" -f net8.0-macos -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
Copy_Plugins "$Plugins_Release_Path/net8.0-macos" "Authenticator" "BD.WTTS.Client.Plugins.Authenticator.dll"
echo "编译账户插件"
Plugins_GameAccount_Path="$Base_Path/src/BD.WTTS.Client.Plugins.GameAccount"
cd "$Plugins_GameAccount_Path"
dotnet publish -c Release -p:PublishDir="$Publish_Path" -f net8.0-macos -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
Copy_Plugins "$Plugins_Release_Path/net8.0-macos" "GameAccount" "BD.WTTS.Client.Plugins.GameAccount.dll"
echo "编译游戏库插件"
Plugins_GameList_Path="$Base_Path/src/BD.WTTS.Client.Plugins.GameList"
cd "$Plugins_GameList_Path"
dotnet publish -c Release -p:PublishDir="$Publish_Path" -f net8.0-macos -p:EnableCodeSigning=true -p:CodesignKey="$CodesignKey_Name"
Copy_Plugins "$Plugins_Release_Path/net8.0-macos" "GameList" "BD.WTTS.Client.Plugins.GameList.dll"
echo "复制插件到程序目录"
cd "$App_Path"
# 根据 Build_Mode 执行不同逻辑
if [ "$Build_Mode" = "any" ]; then
cp -r "$App_Modules_Path" "$Plugins_Release_Path/net8.0-macos/Steam++.app/Contents/MonoBundle"
elif [ "$Build_Mode" = "arm64" ]; then
cp -r "$App_Modules_Path" "$Plugins_Release_Path/net8.0-macos/osx-arm64/Steam++.app/Contents/MonoBundle"
cp -r "$Plugins_Release_Path/net8.0-macos/Steam++.app/Contents/Resources" "$Plugins_Release_Path/net8.0-macos/Steam++.app/Contents"
elif [ "$Build_Mode" = "x64" ]; then
cp -r "$App_Modules_Path" "$Plugins_Release_Path/net8.0-macos/osx-x64/Steam++.app/Contents/MonoBundle"
cp -r "$Plugins_Release_Path/net8.0-macos/Steam++.app/Contents/Resources" "$Plugins_Release_Path/net8.0-macos/Steam++.app/Contents"
fi
echo "代码签名重新手动签名"
App_Publish_Path="$App_Path/bin/Release/net8.0-macos/Steam++.app"
# #代码签名重新手动签名
codesign --remove-signature "$App_Publish_Path"
codesign --remove-signature "$App_Publish_Path/Contents/MacOS/Steam++"
dylibs=$(find "$App_Publish_Path/Contents/MonoBundle" -type f -name "*.dylib")
for dylib in $dylibs; do
codesign --remove-signature "$dylib"
codesign -f -s "$CodesignKey_Name" "$dylib"
done
codesign -f -s "$CodesignKey_Name" "$App_Publish_Path/Contents/MacOS/Steam++"
codesign -f -s "$CodesignKey_Name" "$App_Publish_Path"
sudo xattr -rd com.apple.quarantine "$App_Publish_Path"
+16 -390
View File
@@ -135,8 +135,8 @@
{
"TypeName": "double",
"PropertyName": "WindowBackgroundOpacity",
"DefaultValue": "OperatingSystem2.IsWindows11AtLeast() ? .0 : .8",
"DefaultValueIsConst": false,
"DefaultValue": ".8",
"DefaultValueIsConst": true,
"Summary": "窗口背景不透明度",
"IsRegionOrEndregion": null,
"IsValueType": null
@@ -171,7 +171,7 @@
{
"TypeName": "string",
"PropertyName": "WindowBackgroundCustomImagePath",
"DefaultValue": "\"avares://BD.WTTS.Client.Avalonia/UI/Assets/back.png\"",
"DefaultValue": "\"/UI/Assets/back.png\"",
"DefaultValueIsConst": true,
"Summary": "自定义背景图像路径",
"IsRegionOrEndregion": null,
@@ -203,24 +203,6 @@
"Summary": "",
"IsRegionOrEndregion": false,
"IsValueType": null
},
{
"TypeName": "HashSet<string>",
"PropertyName": "SortMenuTabs",
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "菜单排序",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "string",
"PropertyName": "StartDefaultPageName",
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "程序启动时默认页",
"IsRegionOrEndregion": null,
"IsValueType": null
}
],
"Usings": ""
@@ -268,21 +250,12 @@
{
"TypeName": "bool",
"PropertyName": "TrayIcon",
"DefaultValue": "true",
"DefaultValue": "false",
"DefaultValueIsConst": true,
"Summary": "启用托盘图标",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "MessagePopupNotification",
"DefaultValue": "true",
"DefaultValueIsConst": true,
"Summary": "启用消息推送通知",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "GameListUseLocalCache",
@@ -345,114 +318,6 @@
"Summary": "禁用插件",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "PluginSafeMode",
"DefaultValue": "true",
"DefaultValueIsConst": true,
"Summary": "插件安全模式",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "DateTimeOffset",
"PropertyName": "LastLookNoticeDateTime",
"DefaultValue": "default",
"DefaultValueIsConst": false,
"Summary": "最后查看通知时间",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "",
"PropertyName": "",
"DefaultValue": "",
"DefaultValueIsConst": true,
"Summary": "配置应用程序的 Web 代理",
"IsRegionOrEndregion": true,
"IsValueType": null
},
{
"TypeName": "AppWebProxyMode",
"PropertyName": "WebProxyMode",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 代理模式",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "string",
"PropertyName": "CustomWebProxyModeHost",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 Host",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "int",
"PropertyName": "CustomWebProxyModePort",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 Port",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "string",
"PropertyName": "CustomWebProxyModeAddress",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 Address",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "bool",
"PropertyName": "CustomWebProxyModeBypassOnLocal",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 BypassOnLocal",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "string",
"PropertyName": "CustomWebProxyModeCredentialUserName",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 NetworkCredential.UserName",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "string",
"PropertyName": "CustomWebProxyModeCredentialPassword",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 NetworkCredential.Password",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "string",
"PropertyName": "CustomWebProxyModeCredentialDomain",
"DefaultValue": "default",
"DefaultValueIsConst": true,
"Summary": "Web 自定义代理 NetworkCredential.Domain",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "",
"PropertyName": "",
"DefaultValue": "",
"DefaultValueIsConst": true,
"Summary": "",
"IsRegionOrEndregion": false,
"IsValueType": null
}
],
"Usings": ""
@@ -462,11 +327,11 @@
"InterfaceFilePath": "..\\src\\BD.WTTS.Client.Plugins.GameAccount\\Settings\\Abstractions",
"Properties": [
{
"TypeName": "ConcurrentDictionary<string, string?>",
"TypeName": "ConcurrentDictionary<long, string?>",
"PropertyName": "AccountRemarks",
"DefaultValue": "new()",
"DefaultValueIsConst": false,
"Summary": "账号备注字典",
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "Steam 账号备注字典",
"IsRegionOrEndregion": null,
"IsValueType": null
},
@@ -513,15 +378,6 @@
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "GridLayoutType",
"PropertyName": "GameLibraryLayoutType",
"DefaultValue": "GridLayoutType.Grid",
"DefaultValueIsConst": true,
"Summary": "库存游戏展示布局",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "bool",
"PropertyName": "GameCloudArchiveFilter",
@@ -543,8 +399,8 @@
{
"TypeName": "Dictionary<uint, string?>",
"PropertyName": "HideGameList",
"DefaultValue": "new()",
"DefaultValueIsConst": false,
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "隐藏的游戏列表",
"IsRegionOrEndregion": null,
"IsValueType": null
@@ -552,8 +408,8 @@
{
"TypeName": "Dictionary<uint, string?>",
"PropertyName": "AFKAppList",
"DefaultValue": "new()",
"DefaultValueIsConst": false,
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "挂时长游戏列表",
"IsRegionOrEndregion": null,
"IsValueType": null
@@ -598,12 +454,15 @@
{
"TypeName": "string",
"PropertyName": "SteamProgramPath",
"DefaultValue": "null",
"DefaultValue": "Ioc.Get<ISteamService>().SteamProgramPath",
"DefaultValueIsConst": false,
"Summary": "Steam 默认程序路径",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"Sharp": "endif"
},
{
"TypeName": "bool",
"PropertyName": "IsAutoRunSteam",
@@ -640,15 +499,6 @@
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "IsRunSteamVGUI",
"DefaultValue": "false",
"DefaultValueIsConst": true,
"Summary": "Steam 以旧版 VGUI 启动",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "IsEnableSteamLaunchNotification",
@@ -675,9 +525,6 @@
"Summary": "Steam 以管理员权限运行",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"Sharp": "endif"
}
],
"Usings": ""
@@ -952,227 +799,6 @@
},
{
"Sharp": "endif"
},
{
"TypeName": "bool",
"PropertyName": "UseDoh",
"DefaultValue": "true",
"DefaultValueIsConst": true,
"Summary": "启用 DNS over HTTPS",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "string",
"PropertyName": "CustomDohAddres",
"DefaultValue": "null",
"DefaultValueIsConst": true,
"Summary": "自定义 DNS over HTTPS 地址",
"IsRegionOrEndregion": null,
"IsValueType": null
}
],
"Usings": ""
},
"SteamIdleSettings": {
"ClassFilePath": "..\\src\\BD.WTTS.Client.Plugins.SteamIdleCard\\Settings",
"InterfaceFilePath": "..\\src\\BD.WTTS.Client.Plugins.SteamIdleCard\\Settings\\Abstractions",
"Properties": [
{
"TypeName": "TimeSpan",
"PropertyName": "IdleTime",
"DefaultValue": "TimeSpan.FromMinutes(6)",
"DefaultValueIsConst": false,
"Summary": "挂卡状态更新时间",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "IdleRule",
"PropertyName": "IdleRule",
"DefaultValue": "IdleRule.FastMode",
"DefaultValueIsConst": false,
"Summary": "运行规则",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "IdleSequentital",
"PropertyName": "IdleSequentital",
"DefaultValue": "IdleSequentital.Default",
"DefaultValueIsConst": false,
"Summary": "运行顺序",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "MaxIdleCount",
"DefaultValue": "30",
"DefaultValueIsConst": false,
"Summary": "最大并行运行游戏数量",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "double",
"PropertyName": "MinRunTime",
"DefaultValue": "2",
"DefaultValueIsConst": false,
"Summary": "最少游戏时间 hours",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "double",
"PropertyName": "SwitchTime",
"DefaultValue": "5000",
"DefaultValueIsConst": false,
"Summary": "自动切换游戏时间间隔 ms",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "double",
"PropertyName": "RefreshBadgesTime",
"DefaultValue": "6",
"DefaultValueIsConst": false,
"Summary": "自动刷新徽章数据时间间隔 min",
"IsRegionOrEndregion": null,
"IsValueType": true
}
],
"Usings": ""
},
"ASFSettings": {
"ClassFilePath": "..\\src\\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus\\Settings",
"InterfaceFilePath": "..\\src\\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus\\Settings\\Abstractions",
"Properties": [
{
"TypeName": "string",
"PropertyName": "ArchiSteamFarmExePath",
"DefaultValue": "string.Empty",
"DefaultValueIsConst": false,
"Summary": "ASF 路径",
"IsRegionOrEndregion": null,
"IsValueType": false
},
{
"TypeName": "bool",
"PropertyName": "AutoRunArchiSteamFarm",
"DefaultValue": "false",
"DefaultValueIsConst": false,
"Summary": "程序启动时自动运行 ASF",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "bool",
"PropertyName": "CheckArchiSteamFarmExe",
"DefaultValue": "false",
"DefaultValueIsConst": false,
"Summary": "检查文件安全性",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "ConsoleMaxLineDefault",
"DefaultValue": "200",
"DefaultValueIsConst": true,
"Summary": "控制台默认最大行数",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "MinRangeConsoleMaxLine",
"DefaultValue": "DefaultConsoleMaxLineDefault",
"DefaultValueIsConst": true,
"Summary": "控制台默认最大行数范围最小值",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "MaxRangeConsoleMaxLine",
"DefaultValue": "5000",
"DefaultValueIsConst": true,
"Summary": "控制台默认最大行数范围最大值",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "ConsoleMaxLine",
"DefaultValue": "DefaultConsoleMaxLineDefault",
"DefaultValueIsConst": false,
"Summary": "控制台最大行数",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "ConsoleFontSizeDefault",
"DefaultValue": "14",
"DefaultValueIsConst": true,
"Summary": "",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "MinRangeConsoleFontSize",
"DefaultValue": "8",
"DefaultValueIsConst": true,
"Summary": "",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "MaxRangeConsoleFontSize",
"DefaultValue": "24",
"DefaultValueIsConst": true,
"Summary": "",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "ConsoleFontSize",
"DefaultValue": "DefaultConsoleFontSizeDefault",
"DefaultValueIsConst": false,
"Summary": "控制台字体大小",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "int",
"PropertyName": "IPCPortIdValue",
"DefaultValue": "6242",
"DefaultValueIsConst": true,
"Summary": "",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "int",
"PropertyName": "IPCPortId",
"DefaultValue": "DefaultIPCPortIdValue",
"DefaultValueIsConst": false,
"Summary": "IPC 端口号,默认值为 <see cref=\"DefaultIPCPortIdValue\" />",
"IsRegionOrEndregion": null,
"IsValueType": true
},
{
"TypeName": "bool",
"PropertyName": "IPCPortOccupiedRandom",
"DefaultValue": "true",
"DefaultValueIsConst": false,
"Summary": "IPC 端口号被占用时是否随机一个未使用的端口号,默认值 <see langword=\"true\" />",
"IsRegionOrEndregion": null,
"IsValueType": true
}
],
"Usings": ""
-78
View File
@@ -1,78 +0,0 @@
<!--👇图标如果发生更改,还需更改 BD.WTTS.Client.Tools.OpenSourceLibraryList(Program.OpenSourceLibraryListEmoji) -->
## 📄 Open Source Library
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
* [System.Reactive](https://github.com/dotnet/reactive)
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
* [YARP](https://github.com/microsoft/reverse-proxy)
* [FastGithub](https://github.com/dotnetcore/FastGithub)
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
* [WinAuth](https://github.com/winauth/winauth)
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
* [Polly](https://github.com/App-vNext/Polly)
* [TaskScheduler](https://github.com/dahall/taskscheduler)
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
* [NLog](https://github.com/nlog/NLog)
* [NUnit](https://github.com/nunit/nunit)
* [ReactiveUI](https://github.com/reactiveui/reactiveui)
* [MessageBox.Avalonia](https://github.com/AvaloniaUtils/MessageBox.Avalonia)
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
* [APNG.NET](https://github.com/jz5/APNG.NET)
* [Moq](https://github.com/moq/moq4)
* [NPOI](https://github.com/nissl-lab/npoi)
* [Fleck](https://github.com/statianzo/Fleck)
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
* [QRCoder](https://github.com/codebude/QRCoder)
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
* [React](https://github.com/facebook/react)
* [Ant Design](https://github.com/ant-design/ant-design)
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
* [GooglePlayServicesComponents](https://github.com/xamarin/GooglePlayServicesComponents)
* [Picasso](https://github.com/square/picasso)
* [OkHttp](https://github.com/square/okhttp)
* [Material Components for Android](https://github.com/material-components/material-components-android)
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
* [Android Jetpack](https://github.com/androidx/androidx)
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
* [Entity Framework Core](https://github.com/dotnet/efcore)
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
* [Windows Forms](https://github.com/dotnet/winforms)
* [Windows Presentation Foundation (WPF)](https://github.com/dotnet/wpf)
* [C#/WinRT](https://github.com/microsoft/CsWinRT)
* [command-line-api](https://github.com/dotnet/command-line-api)
* [.NET Runtime](https://github.com/dotnet/runtime)
* [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons)
* [Material design icons](https://github.com/google/material-design-icons)
Binary file not shown.
+1 -4
View File
@@ -1,4 +1 @@
### [OpenWrt](https://openwrt.org/start)
TODO
Asuswrt-Merlin
### [OpenWrt](https://openwrt.org/start)
+84 -49
View File
@@ -1,30 +1,62 @@
<!-- https://keylol.com/t667906-1-1 -->
# 前言
Steam++ 是完全开源的,请不要在非官方渠道下载软件。我们也制作了自己的[官网](https://www.steampp.net),大家可以去[官网](https://www.steampp.net)或者开源仓库地址下载。
# Steam++ 工具箱
Steam++是一款开源的跨平台Steam工具箱,请不要在非官方渠道下载软件,
[官网](https://www.steampp.net),大家可以去官网或者开源仓库地址下载。
## x.y.z 更新内容
微软商店版本在微软商店检查获取更新即可,一般会比桌面版晚上几天的审核时间。
# Steam++工具箱
## 2.6.2更新内容
微软商店版本在微软商店检查获取更新即可,一般会比桌面版晚上一天的审核时间。
### 版本亮点
TODO
1. ASF 升级至 **V5.2.0.10**
2. 新增 ASF 控制台字体大小、最大行数设置项
3. 新增 Steam 下载完成定时关机、睡眠功能
4. 新增 代理设置可自定义 DNS
5. 新增 ASF 编辑/移除 Bot 功能
6. 新增 Microsoft/Xbox 相关加速服务 (需要升级到 **2.6.2** 之后可用)
7. 新增 Uplay 相关加速服务 (需要升级到 **2.6.2** 之后可用)
8. 新增 OneDrive 等更多相关加速服务 (需要升级到 **2.6.2** 之后可用)
9. 优化 Desktop 加速代理性能
10. 优化 Desktop 脚本注入打包的性能
11. 优化 Desktop 已安装游戏加载性能
12. 从此版本开始将使用 Github Action 自动化部署发布
### 修复问题
TODO
1. 改进 Desktop 网络加速现默认使用阿里 DNS(223.5.5.5, 223.6.6.6)
2. 改进 自动更新包文件校验失败时提示
3. 改进 自动更新失败时将自动跳转官网
4. 改进 ASF IPC 默认端口号由 1242 改为 6242
5. 修复 Linux 与 macOS 中 ASF-UI 解压包文件夹分隔符不正确
6. 修复 Windows Hosts 只读时尝试取消只读属性的操作没有正确执行
7. 修复 Windows 此软件自动更新删除更新包缓存时因文件占用引发的中断
8. 修复 Desktop 高 DPI 下动态桌面错位
9. 修复 本地令牌确认交易在登录时可能会卡住
10. 修复 Windows 启用动态桌面后全屏可能导致窗口冻结无法操作
11. 修复 Windows 动态背景有时会被其他窗口遮挡
12. 改进 本地令牌 登录验证码无法加载时可点击在浏览器中查看验证码图片
13. 修复 Desktop 加速代理中可能出现的一些错误
14. 改进 Desktop 令牌详情 UI
15. 改进 Desktop 账号切换中的用户名信息现在默认隐藏
16. 改进 Desktop 深色模式与浅色模式的视觉效果
17. 修复 Pixiv 加速不能登录的问题
18. 修复 Twitch 加速不计算掉宝进度的问题
19. 修复 Discord 加速检测更新失败导致无法启动客户端的问题
20. 修复 Windows 因添加 JumpList 时可能导致的闪退
21. 修复 Desktop 本地令牌 点击锁定后输入密码按回车解锁会循环无限触发锁定的问题
[![steampp.net](https://img.shields.io/badge/WebSite-steampp.net-brightgreen.svg?style=flat-square&color=61dafb)](https://steampp.net)
[![Steam++ vx.y.z](https://img.shields.io/badge/Steam++-vx.y.z-brightgreen.svg?style=flat-square&color=512bd4)]()
[![Steam++ v2.6.2](https://img.shields.io/badge/Steam++-v2.6.2-brightgreen.svg?style=flat-square&color=512bd4)]()
------
## 工具介绍
`Steam++` 是一款开源的跨平台 Steam 工具箱,所有本地功能完全免费,开源发布于 GitHub,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
此工具的大部分功能都是需要您下载安装 Steam 才能使用。
工具预计将整合进大部分常用的 Steam 相关工具,并且尽力做到比原工具更好用。
`Steam++`是一款开源的跨平台Steam工具箱,所有本地功能完全免费,开源发布于Github,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
此工具的大部分功能都是需要您下载安装Steam才能使用。
工具预计将整合进大部分常用的Steam相关工具,并且尽力做到比原工具更好用。
软件截图
[hide]
[attachimg]1463881[/attachimg]
@@ -35,45 +67,46 @@ TODO
## 核心功能
### 1. 本地方法访问加快
略
### 1. 通过本地反代理Steam的社区等网页使其能正常访问
### 2. 快速切换当前设备已经记住登录的 Steam 账号
功能使用Titanium-Web-Proxy开源项目进行本地反代,相比SteamCommunity302工具具有更快的启动速度。让用户能够连接上诸如Steam社区(个人资料页)、Discord语音聊天、Twitch直播观看、Origin下载加速、谷歌验证码、Pixiv图片等。
该功能是读取 Steam 路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的 IP 地址更换,会导致登录状态失效。
### 2. 快速切换当前PC已经记住登陆的Steam账号
### 3. Steam 游戏成就管理
该功能是读取Steam路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的ip地址更换,会导致登陆状态失效。
### 3. Steam游戏成就管理
能够读取任何游戏的成就信息(包括隐藏成就),并且能进行成就修改,包括成就解锁以及成就反解锁,还能够修改成就统计信息
参考 SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的 BUG,修改了游戏列表的加载和操作易用性。
参考SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的BUG,修改了游戏列表的加载和操作易用性。
注意:滥用成就管理功能可能会导致开发者封禁!
[attachimg]1463887[/attachimg]
### 4. Steam 本地两步身份验证器
### 4. Steam本地两步身份验证器
该功能能够将 Steam 手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
该功能能够将Steam手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
不仅能查看手机令牌,还能进行交易报价确认,并且能一键全部确认。
功能参考 WinAuth 开发,功能类似的软件还有 SteamDesktopAuthenticator 等。
功能参考WinAuth开发,功能类似的软件有WinAuth、SteamDesktopAuthenticator。
本地令牌交易市场报价确认
[attachimg]1463890[/attachimg]
### 5. Steam 内置浏览器脚本注入
### 5. Steam内置浏览器脚本注入
通过反代加速功能将 JS 脚本内置插入了 Steam 客户端内的浏览器,达到了与油猴类似的效果。在脚本工坊中可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
通过反代加速功能将js脚本内置插入了Steam客户端内的浏览器,达到了与油猴类似的效果。目前2.0.0.6版本新增了脚本工坊,可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
[attachimg]1463883[/attachimg]
### 6. Steam 家庭库共享排序
### 6.Steam家庭库共享排序
可以排序你的共享库存顺序,避免只能读取 A 的共享游戏,却想玩 B 的共享游戏。
可以排序你的共享库存顺序,避免只能读取A的共享游戏,却想玩B的共享游戏。
### 7. Steam 监控下载完成定时关机
### 7.Steam监控下载完成定时关机
可以监控 Steam 下载列表所有游戏的下载进度并设置下载完成后自动关机或睡眠电脑,节约你的电费。
可以监控Steam下载列表所有游戏的下载进度并设置下载完成后自动关机或睡眠电脑,节约你的电费。
### 8. 已内置 ASF 挂卡功能
### 8.已内置ASF挂卡功能
[ASF](https://github.com/JustArchiNET/ArchiSteamFarm) 大家肯定都不陌生,它实在是太好用了,所以我们内置了 [ASF](https://github.com/JustArchiNET/ArchiSteamFarm) 在 Steam++ 内,并在后续会对 [ASF](https://github.com/JustArchiNET/ArchiSteamFarm) 在 UI 环境下使用做更多增强体验。
[ASF](https://github.com/JustArchiNET/ArchiSteamFarm)大家肯定都不陌生,它实在是太好用了,所以我们内置了ASF在Steam++内,并在后续会对ASF在UI环境下使用做更多增强体验。
### 10. 更多的游戏工具功能
@@ -88,30 +121,32 @@ Linux 截图:
## 运行环境
> 当前版本采用独立部署编译,不需要运行环境也可以运行。
> 程序使用C# 在 .NET 6.0环境下开发,新版采用独立部署编译,不需要运行环境也可以运行)。
RuntimeIdentifier | Available | Edition
--- | --- | ---
win-x64 | ✅ | Preview
osx-x64 | ❌ | TODO
linux-x64 | ❌ | TODO
android-arm64 | ❌ | TODO
linux-arm64 | ❌ | TODO
osx-arm64 | ❌ | TODO
win-arm64 | ❌ | TODO
ios-arm64 | ❌ | TODO
<!-- 不编译 x86/32 bit 包减少测试工作量,Windows 本机加密 32 bit 与 64 bit 不兼容,涉及本地令牌加密 -->
<!-- arm64 for Windows 因 steamclient.dll 缺少 arm64 支持,以及 .NET 目前不支持 ARM64EC,无法加载本机库,涉及库存游戏中的部分功能 -->
win-x64 | ✅ | Stable
osx-x64 | ✅ | β
linux-x64 | ✅ | α
android-arm64 | ✅ | α
android-arm | ✅ | α
linux-arm64 | ✅ | α
linux-arm | ✅ | α
osx-arm64 | ❌ |
win-arm64 | ❌ |
ios-arm64 | ❌ |
## 下载
> [官网](https://steampp.net/)
> [Github](https://github.com/rmbadmin/SteamTools/releases)
> [Gitee](https://gitee.com/rmbgame/SteamTools/releases)
> [Microsoft Store](https://www.microsoft.com/store/productId/9MTCFHS560NG)
> 分流下载:
> [hide]
> [蓝奏云](https://cliencer.lanzoux.com/b0165duja)
> 提取码:1234
> [/hide]
> 使用过程中可能遇到 Windows Defender 误报,您可以选择添加信任。
> [官网](https://steampp.net/)
> [Github](https://github.com/rmbadmin/SteamTools/releases)
> [Gitee](https://gitee.com/rmbgame/SteamTools/releases)
> [Microsoft Store](https://www.microsoft.com/store/productId/9MTCFHS560NG)
> 分流下载:
> [hide]
> [蓝奏云](https://cliencer.lanzoux.com/b0165duja)
> 提取码:1234
> [/hide]
> 使用过程中可能遇到windows defender误报,您可以选择添加信任。
-28
View File
@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>Watt Toolkit</string>
<key>CFBundleIdentifier</key>
<string>net.steampp.app</string>
<key>CFBundleShortVersionString</key>
<string>2.8.3</string>
<key>CFBundleVersion</key>
<string>2.8.3.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSHumanReadableCopyright</key>
<string>© 长沙次元超越科技有限公司. All Rights Reserved.</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
-2
View File
@@ -1,2 +0,0 @@
param([string]$file)
(Get-FileHash $file -Algorithm SHA256).Hash
-87
View File
@@ -1,87 +0,0 @@
create_app_structure() {
APPNAME=$1
APPDIR="$APPNAME.app/Contents"
APPICONS="${{ Steam++_IcnsFile }}"
if [ ! -d "$APPDIR" ]; then
echo "creating app structure $APPDIR"
mkdir -vp "$APPDIR"/{Resources,Frameworks}
cp -v "$APPICONS" "$APPDIR/Resources/$APPNAME.icns"
fi
}
emit_plist() {
PLIST_APPNAME=$1
PLIST_PATH="$2/Info.plist"
if [ "$3" ]; then
LSUIELEMENT="false"
else
LSUIELEMENT="true"
fi
if [ ! -f "$PLIST_PATH" ]; then
echo "emiting $PLIST_PATH"
cat <<EOF > "$PLIST_PATH"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>$PLIST_APPNAME</string>
<key>CFBundleIdentifier</key>
<string>net.steampp.app</string>
<key>CFBundleShortVersionString</key>
<string>${{ Steam++_ShortVersion }}</string>
<key>CFBundleVersion</key>
<string>${{ Steam++_Version }}</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleExecutable</key>
<string>${{ Steam++_RunName }}</string>
<key>CFBundleGetInfoString</key>
<string>${{ Steam++_RunName }}</string>
<key>CFBundleIconFile</key>
<string>$PLIST_APPNAME</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>LSUIElement</key>
<string>$LSUIELEMENT</string>
<key>NSHumanReadableCopyright</key>
<string>© 长沙次元超越科技有限公司. All Rights Reserved.</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
EOF
fi
}
cd "${{ Steam++_OutPutFilePath }}"
BINARYNAME="${{ Steam++_AppName }}"
echo "Building Avalonia demo..."
APPNAME="$BINARYNAME"
APPDIR="$APPNAME.app/Contents"
rm -rf "$APPDIR"
create_app_structure "$APPNAME"
emit_plist "$APPNAME" "$APPDIR" true
mv -f "${{ Steam++_APPDIR }}" "$APPDIR/MacOS"
chmod +x "$APPDIR/MacOS/Steam++"
mkdir "${{ Steam++_APPDIR }}"
mv -f "${{ Steam++_OutPutFilePath }}/$BINARYNAME.app" "${{ Steam++_APPDIR }}/$BINARYNAME.app"
-1
View File
@@ -1 +0,0 @@
dotnet publish "..\src\ST.Client.Desktop.Avalonia.App\ST.Client.Avalonia.App.csproj" -c Release -p:PublishProfile=win-x64 -p:DeployOnBuild=true -p:ExtraDefineConstants=win-x64 --nologo
-82
View File
@@ -1,82 +0,0 @@
param([string]$version,[string]$configuration='Release',[bool]$isPublish=$false)
$ErrorActionPreference = 'Stop'
Write-Host 'dotnet SDK info'
dotnet --info
$RootPath = Split-Path $PSScriptRoot -Parent
$output_dir = "$RootPath\src\ST.Client.Desktop.Avalonia.App\bin\$configuration\Publish"
$proj_path = "$RootPath\src\ST.Client.Desktop.Avalonia.App\ST.Client.Avalonia.App.csproj"
$publishtool_dir = "$RootPath\src\ST.Tools.Publish"
$publishtool_exe = "$publishtool_dir\bin\Release\net6.0\p.exe"
$build_pubxmls = "fd-win-x64","win-x64","fd-win-x86","win-x86","osx-x64","linux-x64","linux-arm64","osx-arm64"
function Build-PublishTool
{
if(-not (Test-Path $publishtool_exe))
{
& dotnet build $publishtool_dir\ST.Tools.Publish.csproj -c Release
if ($LASTEXITCODE) { exit $LASTEXITCODE }
}
$dev=''
if($configuration -eq 'Debug')
{
$dev = "-dev"
}
& $publishtool_exe ver -token $('"')$env:Token$('"') $dev
if ($LASTEXITCODE) { exit $LASTEXITCODE }
# build App
Foreach ($pubxml in $build_pubxmls)
{
Build-App $pubxml
}
& $publishtool_exe full -token $('"')$env:Token$('"') $dev -win_sign_pfx_pwd $('"')$env:WIN_SIGN_PFX_PWD('"')
if ($LASTEXITCODE) { exit $LASTEXITCODE }
}
function Build-App
{
param([string]$rid)
Write-Host "Building $version $rid"
if($rid.StartsWith("fd-"))
{
$publishDir = "$output_dir\FrameworkDependent\$rid"
}else
{
$publishDir = "$output_dir\$rid"
}
Remove-Item $publishDir -Recurse -Force -Confirm:$false -ErrorAction Ignore
if($configuration -eq 'Debug'){ $rid = "dev-$rid" }
& dotnet publish $proj_path -c $configuration -p:PublishProfile=$rid -p:DeployOnBuild=true -p:ExtraDefineConstants=$rid --nologo
if ($LASTEXITCODE) { exit $LASTEXITCODE }
}
if($isPublish)
{
if([String]::IsNullOrEmpty($env:Token))
{
Write-Error "$version Undefined Token : $env:Token"
Exit 1
}
Build-PublishTool
}else
{
Foreach ($pubxml in $build_pubxmls)
{
Build-App $pubxml
}
}
-318
View File
@@ -1,318 +0,0 @@
function Main
{
begin
{
$ErrorActionPreference = 'stop'
$target = 'net472'
$result = 'Steam++'
$bin = '..\source\SteamTools\bin\x86\Release\'
# '*.exe.config'
$targetKeywords = '*.exe','*.dll','*.txt','*.VisualElementsManifest.xml','*.pak','*.bin','*.js','Log4net.config'
$ignoreKeywords = '*.vshost.*','Microsoft.*.resources.dll','ExPlugin.*.dll'
$exeSource = '\Steam++.exe'
if (-not(Test-Path $bin))
{
throw 'Script detected as locate in invalid path exception!! Make sure exist in <SteamTools repository root>\tools-release\'
}
}
end
{
try
{
# clean up current
Get-ChildItem -Directory | Remove-item -Recurse
Get-ChildItem | where { $_.Extension -eq ".zip" } | Remove-Item
Copy-StrictedFilterFileWithDirectoryStructure -Path $(Join-Path $bin $target) -Destination '.\' -Targets $targetKeywords -Exclude $ignoreKeywords
# valid path check
$versionSource = Join-Path $target $exeSource -Resolve
if ((Test-Path $versionSource) -and (Test-Path $target))
{
$version = (Get-ChildItem $versionSource).VersionInfo
$result = $result + ' v{0}.{1}.{2}' -f $version.ProductMajorPart, $version.ProductMinorPart,$version.ProductBuildPart
Rename-Item -NewName $result -Path $target
New-ZipCompression -source $(Join-Path $(Get-Location) $result) -destination $(Join-Path $(Get-Location).Path ('./' + $result + '.zip'))
}
}
catch
{
throw $_
}
}
}
# https://gist.github.com/guitarrapc/e78bbd4ddc07389e17d6
function Copy-StrictedFilterFileWithDirectoryStructure
{
[CmdletBinding()]
param
(
[parameter(
mandatory = 1,
position = 0,
ValueFromPipeline = 1,
ValueFromPipelineByPropertyName = 1)]
[string]
$Path,
[parameter(
mandatory = 1,
position = 1,
ValueFromPipelineByPropertyName = 1)]
[string]
$Destination,
[parameter(
mandatory = 1,
position = 2,
ValueFromPipelineByPropertyName = 1)]
[string[]]
$Targets,
[parameter(
mandatory = 0,
position = 3,
ValueFromPipelineByPropertyName = 1)]
[string[]]
$Excludes
)
begin
{
$list = New-Object 'System.Collections.Generic.List[String]'
}
process
{
Foreach ($target in $Targets)
{
# Copy "All Directory Structure" and "File" which Extension type is $ex
Copy-Item -Path $Path -Destination $Destination -Force -Recurse -Filter $target
}
}
end
{
# Remove -Exclude Item
Foreach ($exclude in $Excludes)
{
Get-ChildItem -Path $Destination -Recurse -File | where Name -like $exclude | Remove-Item
}
# search Folder which include file
$allFolder = Get-ChildItem $Destination -Recurse -Directory
$containsFile = $allFolder | where {$_.GetFiles()}
$containsFile.FullName `
| %{
$fileContains = $_
$result = $allFolder.FullName `
| where {$_ -notin $list} `
| where {
$shortPath = $_
$fileContains -like "$shortPath*"
}
$result | %{$list.Add($_)}
}
$folderToKeep = $list | sort -Unique
# Remove All Empty (none file exist) folders
Get-ChildItem -Path $Destination -Recurse -Directory | where fullName -notin $folderToKeep | Remove-Item -Recurse
}
}
# http://tech.guitarrapc.com/entry/2013/10/08/040325
function New-ZipCompression
{
[CmdletBinding()]
param
(
[parameter(
mandatory,
position = 0,
valuefrompipeline,
valuefrompipelinebypropertyname)]
[string]
$source,
[parameter(
mandatory = 0,
position = 1,
valuefrompipeline,
valuefrompipelinebypropertyname)]
[string]
$destination,
[parameter(
mandatory = 0,
position = 2)]
[switch]
$quiet,
[parameter(
mandatory = 0,
position = 3)]
[switch]
$force
)
try
{
Add-Type -AssemblyName 'System.IO.Compression.FileSystem'
}
catch
{
}
# check file is directory
$file = Get-Item -Path $source
# set zip extension
$zipExtension = '.zip'
# set desktop as destination path if it null
if ([string]::IsNullOrWhiteSpace($destination))
{
if ($file.Mode -like 'd*')
{
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension($source + $zipExtension))
}
else
{
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension(($file | select -First 1 -ExpandProperty fullname))) + $zipExtension
}
}
# check destination is input as .zip
if (-not($destination.EndsWith($zipExtension)))
{
throw ('destination parameter value [{0}] not end with extension {1}' -f $destination, $zipExtension)
}
# check destination is already exist or not
if (Test-Path $destination)
{
Remove-Item -Path $destination -Confirm
}
# compressionLevel
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
# check file mode for source
Write-Verbose ('file.mode = {0}' -f $file.Mode)
if ($file.Mode -like 'd*') # Directory should be d---
{
try # create zip from directory
{
# force output zip file to new destination path, avoiding destination zip name conflict.
if ($force)
{
# check destination is already exist, CreateFromDirectory will fail with same name of destination file.
if (Test-Path $destination)
{
# show warning for same destination exist.
Write-Verbose ('Detected destination name {0} is already exist. Force trying output to new destination zip name.' -f $destination)
# get current destination information
$destinationRoot = [System.IO.Path]::GetDirectoryName($destination)
$destinationfile = [System.IO.Path]::GetFileNameWithoutExtension($destination)
$destinationExtension = [System.IO.Path]::GetExtension($destination)
# renew destination name with (2)...(x) until no more same name catch.
$count = 2
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
while (Test-Path $destination)
{
++$count
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
}
# show warning as destination name had been changed due to escape error.
Write-Verbose ('Deistination name change to new name {0}' -f $destination)
}
}
# include BaseDirectory
$includeBaseDirectory = $true
Write-Verbose ('destination = {0}' -f $destination)
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
Write-Verbose ('includeBaseDirectory = {0}' -f $includeBaseDirectory)
if ($quiet)
{
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory) > $null
$?
}
else
{
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory)
Get-Item $destination
}
}
catch
{
Write-Error $_
$?
}
}
else
{
try # create zip from files
{
# create zip to add
$destzip = [System.IO.Compression.Zipfile]::Open($destination,'Update')
# get items
$files = Get-ChildItem -Path $source
foreach ($file in $files)
{
$file2 = $file.name
Write-Verbose ('destzip = {0}' -f $destzip)
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
Write-Verbose ('file2 = {0}' -f $file2)
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
if ($quiet)
{
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel) > $null
$?
}
else
{
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel)
}
}
}
catch
{
Write-Error $_
$?
}
finally
{
# dispose opened zip
$destzip.Dispose()
}
}
}
Main
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 929 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

-1
View File
@@ -1 +0,0 @@
<svg fill="none" height="35" viewBox="0 0 35 35" width="35" xmlns="http://www.w3.org/2000/svg"><path d="m30.4661 34.928h.2093c2.1842 0 3.9786-1.6362 4.2299-3.7528l.0303-14.1797c-.2484-9.42853-7.9694-16.9955-17.4579-16.9955-9.64507 0-17.4639671 7.8189-17.4639671 17.464 0 9.5419 7.6524471 17.2991 17.1549671 17.464z" fill="#fff"/><g fill="#8b44ac"><path clip-rule="evenodd" d="m17.5239 5.948c-5.4971 0-10.09423 3.85317-11.2379 9.006 1.09492.3069 1.89785 1.3124 1.89785 2.5053 0 1.193-.80293 2.1984-1.89785 2.5054 1.14366 5.1528 5.7408 9.0059 11.2379 9.0059 2.0011 0 3.8829-.5105 5.5223-1.4086v1.3307h5.989v-10.9562c.0055-.1457 0-.3302 0-.4772 0-6.3575-5.1538-11.5113-11.5113-11.5113zm-5.5141 11.5113c0-3.0453 2.4688-5.5141 5.5141-5.5141 3.0454 0 5.5141 2.4688 5.5141 5.5141 0 3.0454-2.4687 5.5141-5.5141 5.5141-3.0453 0-5.5141-2.4687-5.5141-5.5141z" fill-rule="evenodd"/><path d="m7.36841 17.4517c0 1.0174-.82473 1.8421-1.8421 1.8421s-1.84211-.8247-1.84211-1.8421.82474-1.8421 1.84211-1.8421 1.8421.8247 1.8421 1.8421z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1000" viewBox="0 0 1000 1000" fill="none"><g opacity="1" transform="translate(0 0) rotate(0)"><mask id="bg-mask-0" fill="white"><use transform="translate(0 0) rotate(0)" xlink:href="#path_0"></use></mask><g mask="url(#bg-mask-0)" ><path id="路径 1" fill-rule="evenodd" style="fill:#8B44AC" opacity="1" d="M458.004,207.814c23.05,-3.91 80.67,-2.15 104.11,2.93c56.64,12.11 104.49,37.3 145.31,76.17c51.17,48.63 82.62,111.33 91.4,181.84c1.18,10.15 1.96,76.95 1.96,174.21v157.82h-154.3v-17.58c0,-9.77 -0.39,-17.58 -0.98,-17.58c-0.58,0 -7.03,2.93 -14.25,6.64c-23.83,11.92 -49.03,19.92 -81.45,25.59c-20.7,3.71 -67.38,4.1 -88.87,0.97c-97.85,-14.06 -181.83,-74.8 -226.17,-163.08c-7.42,-15.04 -19.92,-47.66 -19.92,-52.35c0,-1.36 5.47,-4.88 12.11,-8c31.25,-14.46 50.39,-50.98 44.53,-84.77c-4.49,-25.98 -21.48,-48.83 -44.73,-59.96c-6.64,-3.12 -11.91,-6.84 -11.91,-8.2c0,-4.3 13.48,-39.46 20.7,-53.52c19.34,-38.87 57.42,-83.4 92,-107.81c38.67,-27.34 82.81,-45.51 130.46,-53.32zM474.614,362.114c-53.13,11.32 -94.54,49.41 -110.55,101.75c-5.08,16.6 -5.27,61.53 -0.2,77.93c33.6,108.99 167.58,140.43 244.53,57.42c14.26,-15.42 28.13,-41.01 33.21,-61.13c4.69,-18.75 4.29,-53.51 -0.78,-72.26c-13.48,-48.64 -49.22,-85.16 -98.83,-100.39c-17.58,-5.47 -49.61,-7.04 -67.38,-3.32z"></path><path id="路径 2" fill-rule="evenodd" style="fill:#8B44AC" opacity="1" d="M153.907 541.604C187.107 573.824 242.387 553.514 245.707 508.004C246.877 489.644 242.577 477.344 230.667 465.034C216.407 450.394 192.777 445.114 173.247 451.954C136.917 465.034 126.167 514.454 153.907 541.604Z"></path></g></g><defs><rect id="path_0" x="0" y="0" width="1000.0000000000001" height="1000" /></defs></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

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