├── .gitattributes
├── TranslationTools
├── .gitignore
├── .vscode
│ ├── settings.json
│ ├── tasks.json
│ └── launch.json
├── compileAllMo.sh
├── TranslationTools.csproj
├── .editorconfig
├── TranslationDefinition.cs
├── applyTemplateChangesToAllPo.sh
├── EntryPoint.cs
├── updateTranslationPot.sh
└── MiscTranslationFiles
│ └── SteamStorePage
│ ├── es.json
│ ├── pt_BR.json
│ ├── zh_Hans.json
│ ├── sergal.json
│ └── de.json
├── SS14.Launcher.FakeRobustToolbox
├── server
│ ├── status
│ ├── .gitignore
│ ├── info
│ └── run
├── README.md
├── SolutionFiles.tar.gz
└── Robust.Client
│ ├── Robust.Client.csproj
│ └── Class1.cs
├── .vscode
├── settings.json
├── launch.json
└── tasks.json
├── SolutionFiles.tar.gz
├── SS14.Launcher
├── Assets
│ ├── icon.ico
│ ├── logo-long.png
│ ├── info-icons
│ │ ├── web.png
│ │ ├── wiki.png
│ │ ├── discord.png
│ │ ├── forum.png
│ │ └── github.png
│ └── Fonts
│ │ └── noto_sans
│ │ ├── NotoSans-Bold.ttf
│ │ ├── NotoSans-Italic.ttf
│ │ ├── NotoSans-Regular.ttf
│ │ └── NotoSans-BoldItalic.ttf
├── Models
│ ├── Data
│ │ ├── Migrations
│ │ │ ├── Script0004_RaiseTime.sql
│ │ │ ├── Script0001_EngineModules.sql
│ │ │ ├── Script0003_Indices.sql
│ │ │ ├── Script0007_MVLoginMVKeyAuth.sql
│ │ │ ├── Script0002_ContentDB.cs
│ │ │ ├── Script0008_MVRemoveWizDenServers.sql
│ │ │ ├── Script0005_Filters.sql
│ │ │ ├── Script0006_Hubs.sql
│ │ │ └── Script0000_Initial.sql
│ │ ├── Hub.cs
│ │ ├── InstalledEngineModule.cs
│ │ ├── InstalledEngineVersion.cs
│ │ ├── LoginInfoGuest.cs
│ │ ├── LoginInfo.cs
│ │ ├── LoginInfoAccount.cs
│ │ ├── LoginInfoKey.cs
│ │ ├── TypeHandlers.cs
│ │ └── FavoriteServer.cs
│ ├── OverrideAssets
│ │ └── Migrations
│ │ │ └── Script0001_Initial.sql
│ ├── UpdateException.cs
│ ├── ContentManagement
│ │ ├── Migrations
│ │ │ ├── Script0002_ContentIdIndex.sql
│ │ │ └── Script0001_Blake2B.sql
│ │ ├── Model.cs
│ │ └── ContentCompressionScheme.cs
│ ├── ContentLaunchInfo.cs
│ ├── ServerStatus
│ │ ├── IServerSource.cs
│ │ ├── ServerStatusCode.cs
│ │ └── IServerStatusData.cs
│ ├── LoginToken.cs
│ ├── Logins
│ │ ├── AccountLoginStatus.cs
│ │ └── LoggedInAccount.cs
│ ├── LoginTokenExt.cs
│ ├── ServerInfo.cs
│ └── LauncherInfoManager.cs
├── AssemblyInfo.cs
├── Global.cs
├── signing_key
├── signing_key_multiverse
├── FodyWeavers.xml
├── ViewModels
│ ├── Login
│ │ ├── IErrorOverlayOwner.cs
│ │ ├── BaseLoginViewModel.cs
│ │ ├── AuthErrorsOverlayViewModel.cs
│ │ ├── ExpiredLoginViewModel.cs
│ │ ├── ResendConfirmationViewModel.cs
│ │ ├── ForgotPasswordViewModel.cs
│ │ └── AuthTfaViewModel.cs
│ ├── IdentityTabs
│ │ ├── IdentityTabViewModel.cs
│ │ ├── AlreadyMadeTabViewModel.cs
│ │ └── InformationTabViewModel.cs
│ ├── MainWindowTabs
│ │ ├── MainWindowTabViewModel.cs
│ │ ├── NewsEntryViewModel.cs
│ │ ├── DevelopmentTabViewModel.cs
│ │ ├── ServerFilterViewModel.cs
│ │ └── NewsTabViewModel.cs
│ └── ViewModelBase.cs
├── Views
│ ├── MainWindowAge.xaml.cs
│ ├── MainWindowIdentity.xaml.cs
│ ├── MainWindowTabs
│ │ ├── ServerFilterView.xaml.cs
│ │ ├── DevelopmentTabView.xaml.cs
│ │ ├── NewsTabView.xaml.cs
│ │ ├── ServerListFiltersView.xaml.cs
│ │ ├── ServerFilterCounterView.xaml.cs
│ │ ├── ServerListTabView.xaml.cs
│ │ ├── ServerFilterView.xaml
│ │ ├── ServerEntryView.xaml.cs
│ │ ├── ServerFilterCounterView.xaml
│ │ ├── OptionsTabView.xaml.cs
│ │ ├── DevelopmentTabView.xaml
│ │ ├── NewsTabView.xaml
│ │ └── HomePageView.xaml.cs
│ ├── IdentityTabs
│ │ ├── LoginTabView.cs
│ │ ├── AlreadyMadeTabView.cs
│ │ ├── InformationTabView.cs
│ │ ├── GuestTabView.cs
│ │ ├── KeyNewTabView.cs
│ │ ├── AlreadyMadeTabView.xaml
│ │ ├── InformationTabView.xaml
│ │ ├── KeyImportTabView.cs
│ │ ├── KeyImportTabView.xaml
│ │ ├── LoginTabView.xaml
│ │ ├── GuestTabView.xaml
│ │ └── KeyNewTabView.xaml
│ ├── Login
│ │ ├── ExpiredLoginView.xaml.cs
│ │ ├── RegisterNeedsConfirmationView.xaml.cs
│ │ ├── AuthTfaView.xaml.cs
│ │ ├── ForgotPasswordView.xaml.cs
│ │ ├── ResendConfirmationView.xaml.cs
│ │ ├── RegisterView.xaml.cs
│ │ ├── AuthErrorsOverlayView.xaml.cs
│ │ ├── LoginView.xaml.cs
│ │ ├── AuthErrorsOverlayView.xaml
│ │ ├── RegisterNeedsConfirmationView.xaml
│ │ ├── ForgotPasswordView.xaml
│ │ ├── ResendConfirmationView.xaml
│ │ ├── AuthTfaView.xaml
│ │ ├── ExpiredLoginView.xaml
│ │ └── RegisterView.xaml
│ ├── MainWindowEighteenPlusInitialSetting.xaml.cs
│ ├── RandomMessage.xaml.cs
│ ├── DungSpinner.xaml
│ ├── RandomMessage.xaml
│ ├── ConnectingOverlay.xaml.cs
│ ├── LanguageDropDown.xaml.cs
│ ├── ServerInfoLinkControl.xaml
│ ├── AccountDropDown.xaml.cs
│ ├── IconLabel.cs
│ ├── DirectConnectDialog.xaml
│ ├── AddFavoriteDialog.xaml.cs
│ ├── AddFavoriteDialog.xaml
│ ├── ConfigureKeyDialog.xaml.cs
│ ├── DirectConnectDialog.xaml.cs
│ ├── ServerInfoLinkControl.xaml.cs
│ ├── LanguageDropDown.xaml
│ ├── AngleBox.cs
│ ├── AccountDropDown.xaml
│ ├── MainWindowIdentity.xaml
│ └── HubSettingsDialog.xaml.cs
├── LauncherVersion.cs
├── Theme
│ ├── ThemeTabItem.xaml
│ ├── ThemeAngleBox.xaml
│ ├── ThemeServerList.axaml
│ ├── ThemeRandomMessage.xaml
│ ├── ThemeWindow.xaml
│ ├── ThemeIconLabel.xaml
│ ├── ThemeDungSpinner.xaml
│ ├── ThemeOverlayBox.xaml
│ └── ThemeExpander.xaml
├── Utility
│ ├── LocatorExt.cs
│ ├── AlwaysHitTest.cs
│ ├── TempFile.cs
│ ├── Libc.cs
│ ├── NotNullComparer.cs
│ ├── Language.cs
│ ├── ButtonExtensions.cs
│ ├── Blake2B.cs
│ ├── CollectionExtensions.cs
│ ├── DynamicDataExt.cs
│ └── StreamHelper.cs
├── Localization
│ ├── Xaml
│ │ └── GetExtension.cs
│ ├── Loc.cs
│ └── Language.cs
├── IconsLoader.cs
├── ViewLocator.cs
├── Api
│ └── HubApi.cs
├── VcRedistCheck.cs
└── App.xaml
├── SS14.Launcher.Bootstrap
├── console.bat
├── SS14.Launcher.Bootstrap.csproj
└── Program.cs
├── .gitmodules
├── PublishFiles
├── SSMV.Launcher
├── SSMV.desktop
└── Space Station Multiverse Launcher.app
│ └── Contents
│ ├── Resources
│ ├── ss14.icns
│ └── bin
│ │ └── loader
│ │ └── Space Station 14.app
│ │ └── Contents
│ │ ├── Resources
│ │ └── ss14.icns
│ │ ├── MacOS
│ │ └── SS14
│ │ └── Info.plist
│ ├── MacOS
│ └── SS14
│ └── Info.plist
├── publish.sh
├── .gitignore
├── Assets
└── info-icons
│ ├── README.md
│ └── github.svg
├── .editorconfig
├── testLinuxPublishBuild.sh
├── Launcher.props
├── SS14.Launcher.Tests
├── RidUtilityTest.cs
├── SS14.Launcher.Tests.csproj
└── UriHelperTests.cs
├── SS14.Loader
├── MainArgs.cs
├── RedialApi.cs
├── SS14.Loader.csproj
└── ZipFileApi.cs
├── .github
└── workflows
│ ├── build-test.yml
│ └── publish-release.yml
├── SS14.Launcher.sln.DotSettings
├── publish_linux.sh
├── LICENSE.txt
├── flake.lock
├── nix
└── wrapper.nix
├── publish_windows.sh
├── publish_osx.sh
└── flake.nix
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 |
--------------------------------------------------------------------------------
/TranslationTools/.gitignore:
--------------------------------------------------------------------------------
1 | temp
2 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/server/status:
--------------------------------------------------------------------------------
1 | {
2 |
3 | }
4 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.rulers": [
3 | 120
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/README.md:
--------------------------------------------------------------------------------
1 | # Fake Robust.Client for testing
2 |
3 |
4 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/server/.gitignore:
--------------------------------------------------------------------------------
1 | client.zip
2 | Robust.Client.dll
3 |
4 |
--------------------------------------------------------------------------------
/SolutionFiles.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SolutionFiles.tar.gz
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/icon.ico
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/logo-long.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/logo-long.png
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0004_RaiseTime.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE FavoriteServer
2 | ADD RaiseTime DATETIME;
3 |
4 |
--------------------------------------------------------------------------------
/SS14.Launcher.Bootstrap/console.bat:
--------------------------------------------------------------------------------
1 | SET DOTNET_ROOT "%CD%\dotnet"
2 |
3 | dotnet\dotnet.exe bin\SSMV.Launcher.dll
4 |
5 | PAUSE
6 |
--------------------------------------------------------------------------------
/SS14.Launcher/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 |
3 | [assembly: InternalsVisibleTo("SS14.Launcher.Tests")]
4 |
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/info-icons/web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/info-icons/web.png
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/info-icons/wiki.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/info-icons/wiki.png
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "Robust.LoaderApi"]
2 | path = Robust.LoaderApi
3 | url = https://github.com/space-wizards/Robust.LoaderApi.git
4 |
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/info-icons/discord.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/info-icons/discord.png
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/info-icons/forum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/info-icons/forum.png
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/info-icons/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/info-icons/github.png
--------------------------------------------------------------------------------
/PublishFiles/SSMV.Launcher:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | cd "$(dirname "$(readlink -f "$0")")"
3 | export DOTNET_ROOT="$(pwd)/dotnet"
4 | exec ./bin/SSMV.Launcher "$@"
5 |
--------------------------------------------------------------------------------
/SS14.Launcher/Global.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher;
2 |
3 | public static class Global
4 | {
5 | public const ushort DefaultServerPort = 1212;
6 | }
7 |
--------------------------------------------------------------------------------
/SS14.Launcher/signing_key:
--------------------------------------------------------------------------------
1 | -----BEGIN PUBLIC KEY-----
2 | MCowBQYDK2VwAyEApQ9mAhMLbmhQqRH7itgNo75S5rCSMsMXvVRmMv1d9NQ=
3 | -----END PUBLIC KEY-----
4 |
5 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/SolutionFiles.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher.FakeRobustToolbox/SolutionFiles.tar.gz
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Hub.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.Models.Data;
4 |
5 | public sealed record Hub(Uri Address, long Priority);
6 |
--------------------------------------------------------------------------------
/SS14.Launcher/signing_key_multiverse:
--------------------------------------------------------------------------------
1 | -----BEGIN PUBLIC KEY-----
2 | MCowBQYDK2VwAyEAM2YE9eSPVh+Z6yWGseQ8HdK4qLbwjfMd/CxlsjfQitM=
3 | -----END PUBLIC KEY-----
4 |
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Bold.ttf
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Italic.ttf
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-Regular.ttf
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/InstalledEngineModule.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models.Data;
2 |
3 | public sealed record InstalledEngineModule(string Name, string Version);
4 |
--------------------------------------------------------------------------------
/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/SS14.Launcher/Assets/Fonts/noto_sans/NotoSans-BoldItalic.ttf
--------------------------------------------------------------------------------
/SS14.Launcher/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/SS14.Launcher/ViewModels/Login/IErrorOverlayOwner.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.ViewModels.Login;
2 |
3 | public interface IErrorOverlayOwner
4 | {
5 | void OverlayOk();
6 | }
--------------------------------------------------------------------------------
/PublishFiles/SSMV.desktop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env xdg-open
2 | [Desktop Entry]
3 | Encoding=UTF-8
4 | Version=1.0
5 | Type=Application
6 | Exec=env ./SSMV.Launcher %u
7 | Name=Space Station Multiverse
8 |
--------------------------------------------------------------------------------
/TranslationTools/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.rulers": [
3 | 120
4 | ],
5 | "editor.insertSpaces": false,
6 | "editor.tabSize": 4,
7 | "editor.detectIndentation": false
8 | }
9 |
--------------------------------------------------------------------------------
/PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/ss14.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/ss14.icns
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0001_EngineModules.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE EngineModule (
2 | Name TEXT NOT NULL,
3 | Version TEXT NOT NULL,
4 |
5 | CONSTRAINT NameVersion PRIMARY KEY (Name, Version)
6 | );
7 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/OverrideAssets/Migrations/Script0001_Initial.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE OverrideAsset(
2 | Id INTEGER PRIMARY KEY,
3 | Name TEXT UNIQUE NOT NULL,
4 | OverrideName TEXT NOT NULL,
5 | Data BLOB NOT NULL
6 | );
7 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0003_Indices.sql:
--------------------------------------------------------------------------------
1 | -- Wow I can't believe I didn't have unique indices for these.
2 |
3 | CREATE UNIQUE INDEX LoginUniqueId ON Login(UserId);
4 | CREATE UNIQUE INDEX ConfigUniqueKey ON Config(Key);
5 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/UpdateException.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.Models;
4 |
5 | public sealed class UpdateException : Exception
6 | {
7 | public UpdateException(string message) : base(message)
8 | {
9 | }
10 | }
--------------------------------------------------------------------------------
/publish.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd "$(dirname "$0")"
4 |
5 | # Compile Translations
6 | pushd TranslationTools
7 | ./compileAllMo.sh
8 | popd
9 |
10 | # Create builds
11 | ./publish_linux.sh
12 | ./publish_osx.sh
13 | ./publish_windows.sh
14 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ContentManagement/Migrations/Script0002_ContentIdIndex.sql:
--------------------------------------------------------------------------------
1 | -- Create an index for ContentManifest.ContentId
2 | -- Used when clearing out unused Content blobs.
3 |
4 | CREATE INDEX ContentManifest_ContentId ON ContentManifest(ContentId);
5 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0007_MVLoginMVKeyAuth.sql:
--------------------------------------------------------------------------------
1 | -- Adds key auth support
2 |
3 | CREATE TABLE "LoginMVKey" (
4 | "UserName" TEXT NOT NULL,
5 | "PublicKey" TEXT NOT NULL,
6 | "PrivateKey" TEXT NOT NULL,
7 | PRIMARY KEY("PublicKey")
8 | );
9 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowAge.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views;
4 |
5 | public partial class MainWindowAge : UserControl
6 | {
7 | public MainWindowAge()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | obj/
3 | .idea/
4 | *.zip
5 | *.DotSettings.user
6 | .DS_Store
7 | cmake-build*
8 | publish_test
9 | Dependencies
10 | SS14.Launcher/FodyWeavers.xsd
11 | *.mo
12 |
13 | !PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/bin/
14 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowIdentity.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views;
4 |
5 | public partial class MainWindowIdentity : UserControl
6 | {
7 | public MainWindowIdentity()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/LauncherVersion.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher;
4 |
5 | public static class LauncherVersion
6 | {
7 | public const string Name = "SSMV.Launcher";
8 | public static Version? Version => typeof(LauncherVersion).Assembly.GetName().Version;
9 | }
10 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ContentLaunchInfo.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models;
2 |
3 | ///
4 | /// Information loaded by the updater that we need to launch the game.
5 | ///
6 | public sealed record ContentLaunchInfo(long Version, (string Module, string Version)[] ModuleInfo);
7 |
8 |
--------------------------------------------------------------------------------
/SS14.Launcher/Theme/ThemeTabItem.xaml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/bin/loader/Space Station 14.app/Contents/Resources/ss14.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Skyedra/SS14.Launcher/HEAD/PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/bin/loader/Space Station 14.app/Contents/Resources/ss14.icns
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ServerStatus/IServerSource.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models.ServerStatus;
2 |
3 | ///
4 | /// Where we get server status and info data from.
5 | ///
6 | public interface IServerSource
7 | {
8 | public void UpdateInfoFor(ServerStatusData statusData);
9 | }
10 |
--------------------------------------------------------------------------------
/Assets/info-icons/README.md:
--------------------------------------------------------------------------------
1 | To add more icons:
2 |
3 | 1. Put SVG file here for the future
4 | 2. Put exported PNG in `SS14.Launcher/Assets/info-icons`
5 | 3. Add icon to the `ServerInfoLinkControl.ValidIcons` list in the C# code.
6 | 4. Add the icon to `IconsLoader` in the C# code to have it loaded as a resource.
7 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ContentManagement/Migrations/Script0001_Blake2B.sql:
--------------------------------------------------------------------------------
1 | -- I changed the hash type of most things from SHA256 to BLAKE2b.
2 | -- To avoid any unforeseen problems, I'm gonna go and wipe the database here so any old SHA256 hashes get wiped.
3 |
4 | DELETE FROM ContentVersion;
5 | DELETE FROM Content;
6 |
--------------------------------------------------------------------------------
/TranslationTools/compileAllMo.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Loop through all PO files and compile them to .MO
4 |
5 | for po in `find ../SS14.Launcher -name 'Launcher.po' -type f`
6 | do
7 | echo $po:
8 | mo=`echo $po | sed -e 's/\.po/.mo/'`
9 | #echo $mo
10 | msgfmt --use-fuzzy "$po" -o "$mo"
11 | done
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/ServerFilterView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views.MainWindowTabs;
4 |
5 | public sealed partial class ServerFilterView : UserControl
6 | {
7 | public ServerFilterView()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/IdentityTabs/LoginTabView.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.IdentityTabs;
5 |
6 | public partial class LoginTabView : UserControl
7 | {
8 | public LoginTabView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/Login/ExpiredLoginView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.Login;
5 |
6 | public partial class ExpiredLoginView : UserControl
7 | {
8 | public ExpiredLoginView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/TranslationTools/TranslationTools.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net7.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/DevelopmentTabView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views.MainWindowTabs;
4 |
5 | public sealed partial class DevelopmentTabView : UserControl
6 | {
7 | public DevelopmentTabView()
8 | {
9 | InitializeComponent();
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/NewsTabView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.MainWindowTabs;
5 |
6 | public partial class NewsTabView : UserControl
7 | {
8 | public NewsTabView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/TranslationTools/.editorconfig:
--------------------------------------------------------------------------------
1 | [*]
2 | charset = utf-8
3 |
4 | # Indentation and spacing
5 | indent_size = 4
6 | indent_style = tab
7 | tab_width = 4
8 |
9 | # New line preferences
10 | insert_final_newline = true
11 | trim_trailing_whitespace = true
12 |
13 |
14 | [*.{xaml,axaml,yml,csproj,props}]
15 | indent_size = 2
16 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 | [*]
3 | charset = utf-8
4 |
5 | # Indentation and spacing
6 | indent_size = 4
7 | indent_style = space
8 | tab_width = 4
9 |
10 | # New line preferences
11 | insert_final_newline = true
12 | trim_trailing_whitespace = true
13 |
14 |
15 | [*.{xaml,axaml,yml,csproj,props}]
16 | indent_size = 2
17 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/ServerListFiltersView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views.MainWindowTabs;
4 |
5 | public sealed partial class ServerListFiltersView : UserControl
6 | {
7 | public ServerListFiltersView()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ServerStatus/ServerStatusCode.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models.ServerStatus;
2 |
3 | public enum ServerStatusCode
4 | {
5 | Offline,
6 | FetchingStatus,
7 | Online
8 | }
9 |
10 | public enum ServerStatusInfoCode
11 | {
12 | NotFetched,
13 | Fetching,
14 | Error,
15 | Fetched
16 | }
17 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/IdentityTabs/AlreadyMadeTabView.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.IdentityTabs;
5 |
6 | public partial class AlreadyMadeTabView : UserControl
7 | {
8 | public AlreadyMadeTabView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/IdentityTabs/InformationTabView.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.IdentityTabs;
5 |
6 | public partial class InformationTabView : UserControl
7 | {
8 | public InformationTabView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowEighteenPlusInitialSetting.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views;
4 |
5 | public partial class MainWindowEighteenPlusInitialSetting : UserControl
6 | {
7 | public MainWindowEighteenPlusInitialSetting()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/ServerFilterCounterView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 |
3 | namespace SS14.Launcher.Views.MainWindowTabs;
4 |
5 | public sealed partial class ServerFilterCounterView : UserControl
6 | {
7 | public ServerFilterCounterView()
8 | {
9 | InitializeComponent();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/InstalledEngineVersion.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 |
3 | namespace SS14.Launcher.Models.Data;
4 |
5 | public sealed record InstalledEngineVersion(
6 | [property: JsonPropertyName("version")]
7 | string Version,
8 | [property: JsonPropertyName("signature")]
9 | string Signature);
10 |
--------------------------------------------------------------------------------
/SS14.Launcher/Theme/ThemeAngleBox.xaml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/MainWindowTabs/ServerListTabView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.MainWindowTabs;
5 |
6 | public partial class ServerListTabView : UserControl
7 | {
8 | public ServerListTabView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/ViewModels/IdentityTabs/IdentityTabViewModel.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.ViewModels.IdentityTabs;
2 |
3 | public abstract class IdentityTabViewModel : ViewModelBase
4 | {
5 | public abstract string Name { get; }
6 |
7 | public bool IsSelected { get; set; }
8 |
9 | public virtual void Selected()
10 | {
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/Login/RegisterNeedsConfirmationView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 |
4 | namespace SS14.Launcher.Views.Login;
5 |
6 | public partial class RegisterNeedsConfirmationView : UserControl
7 | {
8 | public RegisterNeedsConfirmationView()
9 | {
10 | InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/ViewModels/MainWindowTabs/MainWindowTabViewModel.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.ViewModels.MainWindowTabs;
2 |
3 | public abstract class MainWindowTabViewModel : ViewModelBase
4 | {
5 | public abstract string Name { get; }
6 |
7 | public bool IsSelected { get; set; }
8 |
9 | public virtual void Selected()
10 | {
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/ViewModels/ViewModelBase.cs:
--------------------------------------------------------------------------------
1 | using ReactiveUI;
2 |
3 | namespace SS14.Launcher.ViewModels;
4 |
5 | public class ViewModelBase : ReactiveObject, IViewModelBase
6 | {
7 | }
8 |
9 | ///
10 | /// Signifies to that this viewmodel can be automatically located.
11 | ///
12 | public interface IViewModelBase
13 | {
14 | }
15 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/LocatorExt.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Splat;
3 |
4 | namespace SS14.Launcher.Utility;
5 |
6 | public static class LocatorExt
7 | {
8 | public static T GetRequiredService(this IReadonlyDependencyResolver resolver)
9 | {
10 | return resolver.GetService() ?? throw new InvalidOperationException("Service does not exist!");
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/TranslationTools/TranslationDefinition.cs:
--------------------------------------------------------------------------------
1 | ///
2 | /// Represents a unique translation entry.
3 | /// Roughly maps to: https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
4 | ///
5 | public class TranslationDefinition
6 | {
7 | public string msgId;
8 | public string context;
9 | public List sourceReferences = new List();
10 | }
11 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/server/info:
--------------------------------------------------------------------------------
1 | {
2 | "connect_address": "udp://localhost:1212/",
3 | "auth": {
4 | "mode": "Disabled",
5 | "public_key": ""
6 | },
7 | "build": {
8 | "engine_version": "meme",
9 | "fork_id": "custom",
10 | "version": "123",
11 | "download_url": "",
12 | "hash": null
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/LoginToken.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.Models;
4 |
5 | public readonly struct LoginToken
6 | {
7 | public readonly string Token;
8 | public readonly DateTimeOffset ExpireTime;
9 |
10 | public LoginToken(string token, DateTimeOffset expireTime)
11 | {
12 | Token = token;
13 | ExpireTime = expireTime;
14 | }
15 | }
--------------------------------------------------------------------------------
/TranslationTools/applyTemplateChangesToAllPo.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Loop through all PO files and update them with latest translations from template file
4 |
5 | template="../SS14.Launcher/Assets/locale/en_US/LC_MESSAGES/Launcher.pot"
6 |
7 | for po in `find ../SS14.Launcher -name 'Launcher.po' -type f`
8 | do
9 | echo $po:
10 | msgmerge -U --backup=none --no-fuzzy-matching "$po" "$template"
11 | done
12 |
--------------------------------------------------------------------------------
/testLinuxPublishBuild.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Simple script for doing a publish and running it (useful for my testing)
3 | # (this is a bit inefficient, but tests exactly what someone would download)
4 | ./publish_linux.sh
5 | rm -rf ../ssmvTestPublish
6 | mkdir ../ssmvTestPublish
7 | cp SSMV.Launcher_Linux.zip ../ssmvTestPublish/
8 | cd ../ssmvTestPublish
9 | unzip SSMV.Launcher_Linux.zip
10 | ./SSMV.Launcher
11 |
--------------------------------------------------------------------------------
/SS14.Launcher/Theme/ThemeServerList.axaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Logins/AccountLoginStatus.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models.Logins;
2 |
3 | public enum AccountLoginStatus
4 | {
5 | Unsure = 0,
6 |
7 | ///
8 | /// Last we checked, the login token was still valid.
9 | ///
10 | Available,
11 |
12 | ///
13 | /// The login token expired and we need the user to log in again.
14 | ///
15 | Expired
16 | }
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/Robust.Client/Robust.Client.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | net6.0
9 | enable
10 | enable
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/SS14.Launcher/Theme/ThemeRandomMessage.xaml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/PublishFiles/Space Station Multiverse Launcher.app/Contents/MacOS/SS14:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # cd to file containing script or something?
4 | BASEDIR=$(dirname "$0")
5 | echo "$BASEDIR"
6 | cd "$BASEDIR"
7 |
8 | mkdir -p "$HOME/Library/Application Support/Space Station Multiverse"
9 |
10 | export DOTNET_ROOT="$(pwd)/../Resources/dotnet"
11 |
12 | exec ../Resources/bin/SSMV.Launcher "$@" > "$HOME/Library/Application Support/Space Station Multiverse/launcher.log"
13 |
--------------------------------------------------------------------------------
/PublishFiles/Space Station Multiverse Launcher.app/Contents/Resources/bin/loader/Space Station 14.app/Contents/MacOS/SS14:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # cd to file containing script or something?
4 | BASEDIR=$(dirname "$0")
5 | echo "$BASEDIR"
6 | cd "$BASEDIR"
7 |
8 | if [[ -z ${SS14_LOG_CLIENT} ]]; then
9 | # No log path
10 | exec ../Resources/bin/SS14.Loader "$@"
11 | else
12 | exec ../Resources/bin/SS14.Loader "$@" > "$SS14_LOG_CLIENT" 2>&1
13 | fi
14 |
15 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ContentManagement/Model.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.Models.ContentManagement;
4 |
5 | // Simple model classes for the content DB.
6 |
7 | public sealed class ContentVersion
8 | {
9 | public long Id;
10 | public byte[] Hash = default!;
11 | public string ForkId = default!;
12 | public string ForkVersion = default!;
13 | public DateTimeOffset LastUsed = default!;
14 | public byte[]? ZipHash;
15 | }
16 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/LoginInfoGuest.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ReactiveUI;
3 | using ReactiveUI.Fody.Helpers;
4 | using SS14.Launcher.Localization;
5 |
6 | namespace SS14.Launcher.Models.Data;
7 |
8 | public class LoginInfoGuest : LoginInfo
9 | {
10 | public override string ToString()
11 | {
12 | return $"{Username} [Guest]";
13 | }
14 |
15 | public override string LoginTypeDisplaySuffix => Loc.GetParticularString("Account Type", "Guest");
16 | }
17 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/LoginTokenExt.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.Models;
4 |
5 | public static class LoginTokenExt
6 | {
7 | public static bool IsTimeExpired(this LoginToken token)
8 | {
9 | return token.ExpireTime <= DateTimeOffset.UtcNow;
10 | }
11 |
12 | public static bool ShouldRefresh(this LoginToken token)
13 | {
14 | return token.ExpireTime <= DateTimeOffset.UtcNow + ConfigConstants.TokenRefreshThreshold;
15 | }
16 | }
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/server/run:
--------------------------------------------------------------------------------
1 | # WARNING: This script will auto-install the engine ver.
2 |
3 | cd ..
4 | dotnet build
5 | cd server
6 | cp ../Robust.Client/bin/Debug/*/Robust.Client.dll ./
7 | zip client.zip Robust.Client.dll
8 | echo WARNING: Copying in "meme" engine version
9 | echo You will still need to formally add the engine version into your launcher config!
10 | cp client.zip ~/".local/share/Space Station 14/launcher/engines/meme.zip"
11 | python3 -m http.server 1212
12 |
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/ContentManagement/ContentCompressionScheme.cs:
--------------------------------------------------------------------------------
1 | namespace SS14.Launcher.Models.ContentManagement;
2 |
3 | ///
4 | /// Compression schemes for data stored in the content database.
5 | ///
6 | public enum ContentCompressionScheme
7 | {
8 | None = 0,
9 | Deflate = 1,
10 |
11 | ///
12 | /// ZStandard compression. In the future may use SS14 specific dictionary IDs in the frame header.
13 | ///
14 | ZStd = 2,
15 | }
16 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/AlwaysHitTest.cs:
--------------------------------------------------------------------------------
1 | using Avalonia;
2 | using Avalonia.Controls;
3 | using Avalonia.Rendering;
4 |
5 | namespace SS14.Launcher.Utility;
6 |
7 | ///
8 | /// Utility control that always hit tests in its geometry region.
9 | /// Necessary to paper over some controls in Avalonia's default theme that have some annoying gaps otherwise.
10 | ///
11 | public sealed class AlwaysHitTest : Panel, ICustomHitTest
12 | {
13 | public bool HitTest(Point point) => true;
14 | }
15 |
--------------------------------------------------------------------------------
/SS14.Launcher/ViewModels/MainWindowTabs/NewsEntryViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SS14.Launcher.ViewModels.MainWindowTabs;
4 |
5 | public class NewsEntryViewModel : ViewModelBase
6 | {
7 | public NewsEntryViewModel(string headline, Uri link)
8 | {
9 | Headline = headline;
10 | Link = link;
11 | }
12 |
13 | public string Headline { get; }
14 | public Uri Link { get; }
15 |
16 | public void Open()
17 | {
18 | Helpers.OpenUri(Link);
19 | }
20 | }
--------------------------------------------------------------------------------
/SS14.Launcher/Views/RandomMessage.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Splat;
3 | using SS14.Launcher.Models;
4 | using SS14.Launcher.Utility;
5 |
6 | namespace SS14.Launcher.Views;
7 |
8 | public sealed partial class RandomMessage : UserControl
9 | {
10 | public RandomMessage()
11 | {
12 | InitializeComponent();
13 | }
14 |
15 | public void Refresh()
16 | {
17 | Text.Text = Locator.Current.GetRequiredService().GetRandomMessage();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/DungSpinner.xaml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Logins/LoggedInAccount.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ReactiveUI;
3 | using SS14.Launcher.Models.Data;
4 |
5 | namespace SS14.Launcher.Models.Logins;
6 |
7 | public abstract class LoggedInAccount : ReactiveObject
8 | {
9 | public string Username => LoginInfo.Username;
10 |
11 | protected LoggedInAccount(LoginInfo loginInfo)
12 | {
13 | LoginInfo = loginInfo;
14 | }
15 |
16 | public LoginInfo LoginInfo { get; }
17 |
18 | public abstract AccountLoginStatus Status { get; }
19 | }
20 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/IdentityTabs/GuestTabView.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using Avalonia.Controls;
4 | using Avalonia.Markup.Xaml;
5 | using ReactiveUI;
6 | using ReactiveUI.Fody.Helpers;
7 | using SS14.Launcher.Api;
8 | using SS14.Launcher.Models.Data;
9 | using SS14.Launcher.Models.Logins;
10 |
11 | namespace SS14.Launcher.Views.IdentityTabs;
12 |
13 | public partial class GuestTabView : UserControl
14 | {
15 |
16 | public GuestTabView()
17 | {
18 | InitializeComponent();
19 | }
20 |
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/IdentityTabs/KeyNewTabView.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using Avalonia.Controls;
4 | using Avalonia.Markup.Xaml;
5 | using ReactiveUI;
6 | using ReactiveUI.Fody.Helpers;
7 | using SS14.Launcher.Api;
8 | using SS14.Launcher.Models.Data;
9 | using SS14.Launcher.Models.Logins;
10 |
11 | namespace SS14.Launcher.Views.IdentityTabs;
12 |
13 | public partial class KeyNewTabView : UserControl
14 | {
15 |
16 | public KeyNewTabView()
17 | {
18 | InitializeComponent();
19 | }
20 |
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/RandomMessage.xaml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Launcher.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 | net9.0
12 | 0.7.4.0
13 |
14 |
15 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/ConnectingOverlay.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Markup.Xaml;
3 | using SS14.Launcher.ViewModels;
4 | using Avalonia.Threading;
5 |
6 | namespace SS14.Launcher.Views;
7 |
8 | public partial class ConnectingOverlay : UserControl
9 | {
10 | public ConnectingOverlay()
11 | {
12 | InitializeComponent();
13 | ConnectingViewModel.StartedConnecting += () => Dispatcher.UIThread.Post(() =>
14 | {
15 | CancelButton.Focus();
16 | Messages.Refresh();
17 | });
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/SS14.Launcher/Theme/ThemeWindow.xaml:
--------------------------------------------------------------------------------
1 |
3 |
16 |
17 |
--------------------------------------------------------------------------------
/SS14.Launcher.Tests/RidUtilityTest.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using SS14.Launcher.Utility;
3 |
4 | namespace SS14.Launcher.Tests;
5 |
6 | [TestFixture]
7 | [Parallelizable(ParallelScope.All)]
8 | [TestOf(typeof(RidUtility))]
9 | public sealed class RidUtilityTest
10 | {
11 | [Test]
12 | [TestCase(new[] {"win-x64", "win7"}, "win7-x64", "win7")]
13 | [TestCase(new[] {"win-x64", "win"}, "win7-x64", "win-x64")]
14 | public void TestFindBestRid(string[] rids, string start, string expected)
15 | {
16 | Assert.That(RidUtility.FindBestRid(rids, start), Is.EqualTo(expected));
17 | }
18 | }
--------------------------------------------------------------------------------
/SS14.Launcher.Tests/SS14.Launcher.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | false
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/LoginInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.Serialization;
3 | using ReactiveUI;
4 | using ReactiveUI.Fody.Helpers;
5 |
6 | namespace SS14.Launcher.Models.Data;
7 |
8 | [DataContract]
9 | public abstract class LoginInfo : ReactiveObject
10 | {
11 | [Reactive]
12 | [DataMember] // (Serialize during JSON Export)
13 | public string Username { get; set; } = default!;
14 |
15 | public override string ToString()
16 | {
17 | return $"{Username} [Unknown]";
18 | }
19 |
20 | [IgnoreDataMember]
21 | public virtual string LoginTypeDisplaySuffix => "Unknown";
22 | }
23 |
--------------------------------------------------------------------------------
/SS14.Loader/MainArgs.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Robust.LoaderApi;
3 |
4 | namespace SS14.Loader;
5 |
6 | internal sealed class MainArgs : IMainArgs
7 | {
8 | public MainArgs(string[] args, IFileApi fileApi, IRedialApi? redialApi, IEnumerable? apiMounts)
9 | {
10 | Args = args;
11 | FileApi = fileApi;
12 | RedialApi = redialApi;
13 | ApiMounts = apiMounts;
14 | }
15 |
16 | public string[] Args { get; }
17 | public IFileApi FileApi { get; }
18 | public IRedialApi? RedialApi { get; }
19 | public IEnumerable? ApiMounts { get; }
20 | }
21 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0002_ContentDB.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Data;
3 | using System.IO;
4 | using Microsoft.Data.Sqlite;
5 |
6 | namespace SS14.Launcher.Models.Data.Migrations;
7 |
8 | public sealed class Script0002_ContentDB : Migrator.IMigrationScript
9 | {
10 | public string Up(SqliteConnection connection)
11 | {
12 | if (Directory.Exists(LauncherPaths.DirServerContent))
13 | Directory.Delete(LauncherPaths.DirServerContent, true);
14 |
15 | return @"
16 | DROP TABLE ServerContent;
17 |
18 | DELETE FROM Config WHERE Key='NextInstallationId';
19 | ";
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0008_MVRemoveWizDenServers.sql:
--------------------------------------------------------------------------------
1 | -- Removes wizden data / blocked wizden servers by default so as to not cause errors
2 |
3 | -- Default onto MV servers
4 | INSERT INTO ServerFilter (Category, Data) VALUES (100, 'multiverse_engine');
5 |
6 | -- No reason to keep old wizden logins since they just throw errors at this point
7 | DELETE FROM Login;
8 |
9 | -- Remove wizden hubs
10 | DELETE FROM Hub WHERE Address="https://hub.spacestation14.com/";
11 | DELETE FROM Hub WHERE Address="https://cdn.spacestationmultiverse.com/wizden-hub-mirror/";
12 | DELETE FROM Hub WHERE Address="https://central.spacestation14.io/hub/";
13 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/Login/AuthTfaView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Input;
3 | using SS14.Launcher.ViewModels.Login;
4 |
5 | namespace SS14.Launcher.Views.Login;
6 |
7 | public sealed partial class AuthTfaView : UserControl
8 | {
9 | public AuthTfaView()
10 | {
11 | InitializeComponent();
12 |
13 | CodeBox.KeyDown += InputBoxOnKeyDown;
14 | }
15 |
16 | private void InputBoxOnKeyDown(object? sender, KeyEventArgs e)
17 | {
18 | if (e.Key == Key.Enter && DataContext is AuthTfaViewModel vm && vm.IsInputValid)
19 | {
20 | vm.ConfirmTfa();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/TempFile.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 |
3 | namespace SS14.Launcher.Utility;
4 |
5 | public static class TempFile
6 | {
7 | public static FileStream CreateTempFile()
8 | {
9 | return new TempFileStream(Path.GetTempFileName());
10 | }
11 |
12 | private sealed class TempFileStream : FileStream
13 | {
14 | public TempFileStream(string path) : base(path, FileMode.Open, FileAccess.ReadWrite)
15 | {
16 | }
17 |
18 | protected override void Dispose(bool disposing)
19 | {
20 | base.Dispose(disposing);
21 |
22 | File.Delete(Name);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/LanguageDropDown.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia;
2 | using Avalonia.Controls;
3 | using Avalonia.Markup.Xaml;
4 |
5 | namespace SS14.Launcher.Views;
6 |
7 | public partial class LanguageDropDown : UserControl
8 | {
9 | public static readonly StyledProperty IsDropDownOpenProperty =
10 | AvaloniaProperty.Register(nameof(IsDropDownOpen));
11 |
12 | public bool IsDropDownOpen
13 | {
14 | get => GetValue(IsDropDownOpenProperty);
15 | set => SetValue(IsDropDownOpenProperty, value);
16 | }
17 |
18 | public LanguageDropDown()
19 | {
20 | InitializeComponent();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0005_Filters.sql:
--------------------------------------------------------------------------------
1 | -- Stores selected server filters for the server list.
2 | -- Each row is one checked filter. Maps to the ServerFilter type in C#.
3 | CREATE TABLE ServerFilter (
4 | Category INTEGER NOT NULL,
5 | Data TEXT NOT NULL,
6 |
7 | CONSTRAINT CategoryData PRIMARY KEY (Category, Data),
8 | -- 0 isn't a valid filter category.
9 | CONSTRAINT CategoryValid CHECK (Category <> 0),
10 | -- Data probably can't be empty.
11 | CONSTRAINT DataNotEmpty CHECK (Data <> '')
12 | );
13 |
14 | -- Set default filters up to not show 18+ servers.
15 | INSERT INTO ServerFilter (Category, Data) VALUES (4, 'false');
16 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/Migrations/Script0006_Hubs.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE Hub (
2 | Address TEXT NOT NULL UNIQUE PRIMARY KEY,
3 | Priority INTEGER NOT NULL UNIQUE, -- 0 is highest priority
4 |
5 | -- Address can't be empty
6 | CONSTRAINT AddressNotEmpty CHECK (Address <> ''),
7 | -- Ensure priority is >= 0
8 | CONSTRAINT PriorityNotNegative CHECK (Priority >= 0)
9 | );
10 |
11 | -- (In multiverse, hubs are reset via c# so they only have to be managed in one location.
12 | -- So the following upstream default is not necessary here as it's included in ConfigDefaults)
13 | -- INSERT INTO Hub (Address, Priority) VALUES ('https://central.spacestation14.io/hub/', 0);
14 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/Libc.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace SS14.Launcher.Utility;
5 |
6 | internal static class Libc
7 | {
8 | public const int RTLD_LAZY = 0x00001;
9 | public const int RTLD_NOW = 0x00002;
10 | public const int RTLD_BINDING_MASK = 0x3;
11 | public const int RTLD_NOLOAD = 0x00004;
12 | public const int RTLD_DEEPBIND = 0x00008;
13 | public const int RTLD_GLOBAL = 0x00100;
14 | public const int RTLD_LOCAL = 0;
15 | public const int RTLD_NODELETE = 0x01000;
16 |
17 | [DllImport("libdl.so.2")]
18 | public static extern IntPtr dlopen([MarshalAs(UnmanagedType.LPUTF8Str)] string name, int flags);
19 | }
20 |
--------------------------------------------------------------------------------
/SS14.Launcher/Models/Data/LoginInfoAccount.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ReactiveUI;
3 | using ReactiveUI.Fody.Helpers;
4 |
5 | namespace SS14.Launcher.Models.Data;
6 |
7 | public class LoginInfoAccount : LoginInfo
8 | {
9 | [Reactive]
10 | public Guid UserId { get; set; }
11 | [Reactive]
12 | public LoginToken Token { get; set; }
13 |
14 | public enum CommonAuthServers
15 | {
16 | WizDen
17 | };
18 |
19 | [Reactive]
20 | public string AuthServer { get; set; }
21 |
22 | public override string ToString()
23 | {
24 | return $"{Username}/{UserId} [Account]";
25 | }
26 |
27 | public override string LoginTypeDisplaySuffix => AuthServer;
28 | }
29 |
--------------------------------------------------------------------------------
/.github/workflows/build-test.yml:
--------------------------------------------------------------------------------
1 | name: Build & Test
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - uses: actions/checkout@v2
15 | with:
16 | submodules: 'recursive'
17 | - name: Setup .NET
18 | uses: actions/setup-dotnet@v3
19 | with:
20 | dotnet-version: 9.0.x
21 | - name: Install dependencies
22 | run: dotnet restore
23 | - name: Build
24 | run: dotnet build --configuration Release --no-restore
25 | - name: SS14.Launcher.Tests
26 | run: dotnet test SS14.Launcher.Tests/SS14.Launcher.Tests.csproj -v n
27 |
--------------------------------------------------------------------------------
/SS14.Launcher.FakeRobustToolbox/Robust.Client/Class1.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Robust.LoaderApi;
3 |
4 | [assembly: LoaderEntryPoint(typeof(Robust.Client.FakeClient))]
5 |
6 | namespace Robust.Client;
7 |
8 | public class FakeClient : ILoaderEntryPoint
9 | {
10 | public void Main(IMainArgs args)
11 | {
12 | var redial = args.RedialApi;
13 | if (redial == null)
14 | {
15 | Console.WriteLine("Cannot redial");
16 | }
17 | else
18 | {
19 | Console.WriteLine("Redialling");
20 | redial.Redial(new Uri("ss14://localhost:1212"), "Example text\nVery long example text with multiple lines.");
21 | }
22 | }
23 | }
24 |
25 |
--------------------------------------------------------------------------------
/SS14.Launcher/Localization/Xaml/GetExtension.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Avalonia.Data;
3 | using Avalonia.Markup.Xaml;
4 | using Avalonia.Markup.Xaml.MarkupExtensions;
5 |
6 | namespace SS14.Launcher.Localization.Xaml;
7 |
8 | public class GetExtension : MarkupExtension
9 | {
10 | public GetExtension(string key)
11 | {
12 | this.Key = key;
13 | }
14 |
15 | public string Key { get; set; }
16 |
17 | public string Context { get; set; }
18 |
19 | public override object ProvideValue(IServiceProvider serviceProvider)
20 | {
21 | if (Context != null)
22 | return Loc.GetParticularStringWithFallback(Context, Key);
23 |
24 | return Loc.GetString(Key);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/SS14.Launcher.Bootstrap/SS14.Launcher.Bootstrap.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | WinExe
6 | net45
7 | Space Station Multiverse Launcher
8 | ../SS14.Launcher/Assets/icon.ico
9 | 11
10 |
11 |
12 |
13 |
14 | all
15 | runtime; build; native; contentfiles; analyzers
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/NotNullComparer.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace SS14.Launcher.Utility;
4 |
5 | ///
6 | /// Wrapper around that handles nulls for you.
7 | ///
8 | /// Type of item that is compared.
9 | public abstract class NotNullComparer : IComparer where T : notnull
10 | {
11 | public abstract int Compare(T x, T y);
12 |
13 | int IComparer.Compare(T? x, T? y)
14 | {
15 | if (ReferenceEquals(x, y))
16 | return 0;
17 |
18 | if (ReferenceEquals(null, y))
19 | return 1;
20 |
21 | if (ReferenceEquals(null, x))
22 | return -1;
23 |
24 | return Compare(x, y);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/SS14.Launcher/Views/Login/ForgotPasswordView.xaml.cs:
--------------------------------------------------------------------------------
1 | using Avalonia.Controls;
2 | using Avalonia.Input;
3 | using Avalonia.Markup.Xaml;
4 | using SS14.Launcher.ViewModels.Login;
5 |
6 | namespace SS14.Launcher.Views.Login;
7 |
8 | public sealed partial class ForgotPasswordView : UserControl
9 | {
10 | public ForgotPasswordView()
11 | {
12 | InitializeComponent();
13 |
14 | var emailBox = this.FindControl("EmailBox");
15 |
16 | emailBox.KeyDown += InputBoxOnKeyDown;
17 | }
18 |
19 | private void InputBoxOnKeyDown(object? sender, KeyEventArgs args)
20 | {
21 | if (args.Key == Key.Enter && DataContext is ForgotPasswordViewModel vm)
22 | {
23 | vm.SubmitPressed();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/SS14.Launcher/Utility/Language.cs:
--------------------------------------------------------------------------------
1 | using System.Threading;
2 |
3 | namespace SS14.Launcher.Utility;
4 |
5 | public static class Language
6 | {
7 | ///
8 | /// Checks if the user's current culture or UI culture matches the given language.
9 | ///
10 | /// Two letter ISO language name, for example "ru".
11 | /// true if either the user's current culture or UI culture match the given language.
12 | public static bool UserHasLanguage(string language)
13 | {
14 | var thread = Thread.CurrentThread;
15 |
16 | return thread.CurrentCulture.TwoLetterISOLanguageName == language ||
17 | thread.CurrentUICulture.TwoLetterISOLanguageName == language;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/TranslationTools/EntryPoint.cs:
--------------------------------------------------------------------------------
1 | public class EntryPoint
2 | {
3 | static void Main(string[] args)
4 | {
5 | if (args.Length == 0)
6 | {
7 | Console.WriteLine("No command passed. Examples:");
8 | Console.WriteLine("\n");
9 | Console.WriteLine("xamlpot -- creates .pot by searching strings in xaml");
10 | Console.WriteLine("TranslationTools xamlpot