Skip to content

Commit 9d6484e

Browse files
committed
first commit
0 parents  commit 9d6484e

20 files changed

Lines changed: 1427 additions & 0 deletions

.github/copilot-instructions.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[x] Verify that the copilot-instructions.md file in the .github directory is created.
2+
3+
[x] Clarify Project Requirements
4+
5+
[x] Scaffold the Project
6+
7+
[x] Customize the Project
8+
9+
[x] Install Required Extensions (none needed)
10+
11+
[x] Compile the Project
12+
13+
[x] Create and Run Task (not needed)
14+
15+
[ ] Launch the Project
16+
17+
[x] Ensure Documentation is Complete
18+
19+
Execution Guidelines
20+
- Track progress through this checklist and mark steps complete with a brief note.
21+
- Avoid verbose explanations or full command outputs; note skips briefly.
22+
- Use the workspace root as the working directory unless stated otherwise.
23+
- Add features only when they serve the requested workflow; ask for clarifications when assumptions arise.
24+
- Do not install extensions beyond those explicitly requested.

.github/workflows/release.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
name: Release on main
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
build-and-release:
13+
runs-on: windows-latest
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@v4
17+
18+
- name: Setup .NET
19+
uses: actions/setup-dotnet@v4
20+
with:
21+
dotnet-version: 6.0.x
22+
23+
- name: Restore
24+
run: dotnet restore WarframeLauncher.sln
25+
26+
- name: Publish (win-x64)
27+
run: dotnet publish WarframeLauncher.sln -c Release -r win-x64 --self-contained false /p:PublishSingleFile=true
28+
29+
- name: Archive publish output
30+
shell: pwsh
31+
run: |
32+
$publishPath = "src/WarframeLauncher/bin/Release/net6.0-windows/win-x64/publish"
33+
if (-not (Test-Path $publishPath)) {
34+
Write-Error "Publish output not found at $publishPath"
35+
}
36+
$artifactName = "LaunchFrame-win-x64.zip"
37+
Compress-Archive -Path "$publishPath/*" -DestinationPath $artifactName -Force
38+
"artifact_path=$artifactName" | Out-File -FilePath $env:GITHUB_ENV -Append
39+
40+
- name: Create GitHub Release
41+
uses: softprops/action-gh-release@v2
42+
with:
43+
tag_name: auto-main-${{ github.run_id }}
44+
name: LaunchFrame auto main ${{ github.run_id }}
45+
body: |
46+
Automated build from main.
47+
Commit: ${{ github.sha }}
48+
files: ${{ env.artifact_path }}
49+
env:
50+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
## Visual Studio
2+
.vs/
3+
*.user
4+
*.suo
5+
*.userosscache
6+
*.sln.docstates
7+
8+
## Build results
9+
[Dd]ebug/
10+
[Rr]elease/
11+
[xX]64/
12+
[xX]86/
13+
build/
14+
bld/
15+
[Bb]in/
16+
[Oo]bj/
17+
18+
## VS Code
19+
.vscode/
20+
21+
## NuGet
22+
*.nupkg
23+
*.snupkg
24+
**/packages/
25+
*.nuget.props
26+
*.nuget.targets
27+
28+
## Logs
29+
*.log
30+
31+
## Runtime
32+
*.pidb
33+
*.svclog
34+
35+
## Others
36+
*.cache
37+
*.tmp

README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# LaunchFrame
2+
3+
LaunchFrame is a Windows launcher that starts Warframe together with helper tools (AlecaFrame, Overframe currently) and opens your reference links in one click (such as wiki.warframe or warframe.market).
4+
5+
## What it does
6+
- Starts helpers first, waits for them to be ready, then launches Warframe (default Steam URI `steam://rungameid/230410`).
7+
- Lets you enable/disable helpers and URLs, edit paths/arguments, and save settings.
8+
- Saves config at `%AppData%\LaunchFrame\config.json` and auto-discovers common install paths when missing.
9+
- Can run headless with `--oneclick` for shortcut/Task Scheduler use.
10+
11+
## Requirements
12+
- Windows 10/11
13+
14+
## Setup
15+
1. Download the latest release zip from GitHub Releases.
16+
2. Extract it anywhere (e.g., Desktop or a tools folder).
17+
3. Run `LaunchFrame.exe`.
18+
19+
## Using LaunchFrame
20+
- Set paths/arguments for AlecaFrame and Overframe, toggle them on/off.
21+
- Set the Warframe URI if you use a non-default launcher.
22+
- Optional: check "Wait for helper readiness" or "Skip if already running".
23+
- Click "Launch Session" to run the sequence.
24+
- Use "Create One-Click" to generate a shortcut that runs `--oneclick` without the UI.
25+
26+
## Notes
27+
- No game injection or modification; LaunchFrame only starts processes and opens URLs.
28+
- Config is created on first save/launch; edit via the UI or by editing the JSON if needed.
29+
30+
## Support LaunchFrame
31+
32+
Enjoying the utility of LaunchFrame? Consider supporting the developer:
33+
34+
**Buy / Play My Games!**
35+
36+
<p align="center">
37+
<a href="https://store.steampowered.com/app/713740/Train_Your_Minibot/">
38+
<img src="https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/713740/header.jpg" alt="TrainYourMinibot" width="250"/>
39+
</a>
40+
<a href="https://store.steampowered.com/app/1792500/Boring_Movies/">
41+
<img src="https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1792500/header.jpg?t=1754577490" alt="BoringMovies" width="250"/>
42+
</a>
43+
<a href="https://store.steampowered.com/app/1490570/git_gud/">
44+
<img src="https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1490570/88fe8479154764080427ee0b703b2b72447740a4/header.jpg?t=1757900982" alt="gitgud" width="250"/>
45+
</a>
46+
<a href="https://store.steampowered.com/app/3819510/DexSweeper/">
47+
<img src="https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3819510/6d92a431630be001667a7da561938d84714264c2/header.jpg?t=1757724028" alt="DexSweeper" width="250"/>
48+
</a>
49+
</p>
50+
51+
Donations Accepted
52+
53+
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/skytech6)

WarframeLauncher.sln

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{74B08CE1-6018-48D9-9E86-A009D16087E2}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarframeLauncher", "src\WarframeLauncher\WarframeLauncher.csproj", "{DC94E5E7-483E-4376-B426-2DD6E9859513}"
9+
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarframeLauncher.Core", "src\WarframeLauncher.Core\WarframeLauncher.Core.csproj", "{71D97266-5990-4B49-86A7-19426292BA40}"
11+
EndProject
12+
Global
13+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
14+
Debug|Any CPU = Debug|Any CPU
15+
Release|Any CPU = Release|Any CPU
16+
EndGlobalSection
17+
GlobalSection(SolutionProperties) = preSolution
18+
HideSolutionNode = FALSE
19+
EndGlobalSection
20+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
21+
{DC94E5E7-483E-4376-B426-2DD6E9859513}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
22+
{DC94E5E7-483E-4376-B426-2DD6E9859513}.Debug|Any CPU.Build.0 = Debug|Any CPU
23+
{DC94E5E7-483E-4376-B426-2DD6E9859513}.Release|Any CPU.ActiveCfg = Release|Any CPU
24+
{DC94E5E7-483E-4376-B426-2DD6E9859513}.Release|Any CPU.Build.0 = Release|Any CPU
25+
{71D97266-5990-4B49-86A7-19426292BA40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
26+
{71D97266-5990-4B49-86A7-19426292BA40}.Debug|Any CPU.Build.0 = Debug|Any CPU
27+
{71D97266-5990-4B49-86A7-19426292BA40}.Release|Any CPU.ActiveCfg = Release|Any CPU
28+
{71D97266-5990-4B49-86A7-19426292BA40}.Release|Any CPU.Build.0 = Release|Any CPU
29+
EndGlobalSection
30+
GlobalSection(NestedProjects) = preSolution
31+
{DC94E5E7-483E-4376-B426-2DD6E9859513} = {74B08CE1-6018-48D9-9E86-A009D16087E2}
32+
{71D97266-5990-4B49-86A7-19426292BA40} = {74B08CE1-6018-48D9-9E86-A009D16087E2}
33+
EndGlobalSection
34+
EndGlobal

sample-config.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"applications": [
3+
{
4+
"id": "alecaframe",
5+
"displayName": "AlecaFrame",
6+
"executablePath": "G:\\Games\\AlecaFrame\\Overwolf\\OverwolfLauncher.exe",
7+
"arguments": "-launchapp afmcagbpgggkpdkokjhjkllpegnadmkignlonpjm -from-startmenu",
8+
"processName": "AlecaFrame",
9+
"readyProcessNames": ["AlecaFrame", "OverwolfBrowser", "OverwolfLauncher"],
10+
"readyWindowSubstring": "AlecaFrame",
11+
"enabled": true,
12+
"waitForReady": true
13+
},
14+
{
15+
"id": "overframe",
16+
"displayName": "Overframe",
17+
"executablePath": "C:\\Program Files\\Overframe\\Overframe.exe",
18+
"processName": "Overframe",
19+
"readyWindowSubstring": "Overframe",
20+
"enabled": true,
21+
"waitForReady": true
22+
},
23+
{
24+
"id": "warframe",
25+
"displayName": "Warframe",
26+
"launchUri": "steam://rungameid/230410",
27+
"enabled": true
28+
}
29+
],
30+
"urls": [
31+
{ "url": "https://warframe.market", "enabled": false },
32+
{ "url": "https://wiki.warframe.com", "enabled": false }
33+
],
34+
"skipIfAlreadyRunning": true,
35+
"waitForHelpersBeforeWarframe": true
36+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using LaunchFrame.Core.Models;
2+
3+
namespace LaunchFrame.Core;
4+
5+
public static class ConfigDefaults
6+
{
7+
public const string DefaultWarframeUri = "steam://rungameid/230410";
8+
9+
public static LauncherConfig CreateDefault()
10+
{
11+
return new LauncherConfig
12+
{
13+
SkipIfAlreadyRunning = true,
14+
WaitForHelpersBeforeWarframe = true,
15+
Applications =
16+
{
17+
new ApplicationEntry
18+
{
19+
Id = "alecaframe",
20+
DisplayName = "AlecaFrame",
21+
ExecutablePath = @"G:\\Games\\AlecaFrame\\Overwolf\\OverwolfLauncher.exe",
22+
Arguments = "-launchapp afmcagbpgggkpdkokjhjkllpegnadmkignlonpjm -from-startmenu",
23+
ProcessName = "AlecaFrame",
24+
ReadyProcessNames = { "AlecaFrame", "OverwolfBrowser", "OverwolfLauncher" },
25+
ReadyWindowSubstring = "AlecaFrame",
26+
Enabled = true,
27+
WaitForReady = true
28+
},
29+
new ApplicationEntry
30+
{
31+
Id = "overframe",
32+
DisplayName = "Overframe",
33+
ProcessName = "Overframe",
34+
ReadyWindowSubstring = "Overframe",
35+
Enabled = true,
36+
WaitForReady = true
37+
},
38+
new ApplicationEntry
39+
{
40+
Id = "warframe",
41+
DisplayName = "Warframe",
42+
LaunchUri = DefaultWarframeUri,
43+
Enabled = true,
44+
WaitForReady = false
45+
}
46+
},
47+
Urls =
48+
{
49+
new UrlEntry { Url = "https://warframe.market", Enabled = false },
50+
new UrlEntry { Url = "https://wiki.warframe.com", Enabled = false }
51+
}
52+
};
53+
}
54+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System.Text.Json;
2+
using LaunchFrame.Core.Models;
3+
4+
namespace LaunchFrame.Core;
5+
6+
public sealed class ConfigService
7+
{
8+
private readonly string _configPath;
9+
private readonly JsonSerializerOptions _serializerOptions = new()
10+
{
11+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
12+
WriteIndented = true
13+
};
14+
15+
public ConfigService(string? customPath = null)
16+
{
17+
_configPath = customPath ?? GetDefaultPath();
18+
var directory = Path.GetDirectoryName(_configPath);
19+
if (!string.IsNullOrWhiteSpace(directory))
20+
{
21+
Directory.CreateDirectory(directory);
22+
}
23+
}
24+
25+
public static string GetDefaultPath()
26+
{
27+
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
28+
return Path.Combine(appData, "LaunchFrame", "config.json");
29+
}
30+
31+
public async Task<LauncherConfig> LoadAsync(CancellationToken cancellationToken = default)
32+
{
33+
if (!File.Exists(_configPath))
34+
{
35+
return ConfigDefaults.CreateDefault();
36+
}
37+
38+
await using var stream = File.OpenRead(_configPath);
39+
var config = await JsonSerializer.DeserializeAsync<LauncherConfig>(stream, _serializerOptions, cancellationToken);
40+
return config ?? ConfigDefaults.CreateDefault();
41+
}
42+
43+
public async Task SaveAsync(LauncherConfig config, CancellationToken cancellationToken = default)
44+
{
45+
await using var stream = File.Create(_configPath);
46+
await JsonSerializer.SerializeAsync(stream, config, _serializerOptions, cancellationToken);
47+
}
48+
}

0 commit comments

Comments
 (0)