From b6933d357a86a8af7da049edff8ca8605bab7ad5 Mon Sep 17 00:00:00 2001 From: mxve <68632137+mxve@users.noreply.github.com> Date: Sat, 10 Jun 2023 09:33:16 +0200 Subject: [PATCH] 'V B ~vomiting face~'- cherry, 2023 --- .gitattributes | 63 ------ .github/dependabot.yml | 6 + .github/workflows/build.yml | 30 +++ .github/workflows/lint.yml | 79 +++++++ .github/workflows/release.yml | 29 +++ .gitignore | 364 +------------------------------ Cargo.lock | 303 +++++++++++++++++++++++++ Cargo.toml | 24 ++ My Project/Resources.Designer.vb | 63 ------ My Project/Resources.resx | 110 ---------- Program.vb | 40 ---- alterware-launcher.sln | 25 --- alterware-launcher.vbproj | 46 ---- icon_bg.ico | Bin 120364 -> 0 bytes res/build.rs | 16 ++ icon.ico => res/icon.ico | Bin src/http.rs | 25 +++ src/main.rs | 49 +++++ 18 files changed, 562 insertions(+), 710 deletions(-) delete mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/release.yml create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 My Project/Resources.Designer.vb delete mode 100644 My Project/Resources.resx delete mode 100644 Program.vb delete mode 100644 alterware-launcher.sln delete mode 100644 alterware-launcher.vbproj delete mode 100644 icon_bg.ico create mode 100644 res/build.rs rename icon.ico => res/icon.ico (100%) create mode 100644 src/http.rs create mode 100644 src/main.rs diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1ff0c42..0000000 --- a/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..0504d76 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "cargo" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a2b79c8 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,30 @@ +name: Build + +on: + workflow_dispatch: + +jobs: + build: + name: build ${{ matrix.target }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + target: [x86_64-pc-windows-gnu, x86_64-unknown-linux-musl] + steps: + - uses: actions/checkout@master + - name: Compile and release + id: compile + uses: rust-build/rust-build.action@v1.4.3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + RUSTTARGET: ${{ matrix.target }} + UPLOAD_MODE: none + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: Binary + path: | + ${{ steps.compile.outputs.BUILT_ARCHIVE }} + ${{ steps.compile.outputs.BUILT_CHECKSUM }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..a98ef5c --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,79 @@ +# Based on https://github.com/actions-rs/meta/blob/master/recipes/quickstart.md +# +# While our "example" application has the platform-specific code, +# for simplicity we are compiling and testing everything on the Ubuntu environment only. +# For multi-OS testing see the `cross.yml` workflow. + +on: [push, pull_request] + +name: lint + +jobs: + check: + name: Check + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Run cargo check + uses: actions-rs/cargo@v1 + continue-on-error: true # WARNING: only for this example, remove it! + with: + command: check + + test: + name: Test Suite + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Run cargo test + uses: actions-rs/cargo@v1 + continue-on-error: true # WARNING: only for this example, remove it! + with: + command: test + + lints: + name: Lints + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: rustfmt, clippy + + - name: Run cargo fmt + uses: actions-rs/cargo@v1 + continue-on-error: true # WARNING: only for this example, remove it! + with: + command: fmt + args: --all -- --check + + - name: Run cargo clippy + uses: actions-rs/cargo@v1 + continue-on-error: true # WARNING: only for this example, remove it! + with: + command: clippy + args: -- -D warnings diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f32c8b1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,29 @@ +# .github/workflows/release.yml + +on: + release: + types: [created] + +jobs: + release: + name: release ${{ matrix.target }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - target: x86_64-pc-windows-gnu + archive: zip + - target: x86_64-unknown-linux-musl + archive: tar.gz tar.xz tar.zst + - target: x86_64-apple-darwin + archive: zip + steps: + - uses: actions/checkout@master + - name: Compile and release + uses: rust-build/rust-build.action@v1.4.3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + RUSTTARGET: ${{ matrix.target }} + ARCHIVE_TYPES: ${{ matrix.archive }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9491a2f..ea8c4bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,363 +1 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Oo]ut/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a7009cb --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,303 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "alterware-launcher" +version = "0.2.0" +dependencies = [ + "http_req", + "winres", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "http_req" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825a38a94c3aff23ea7f60572726829ef055ca02fc64899c3e2e7db2ce4f03f" +dependencies = [ + "rustls", + "unicase", + "webpki", + "webpki-roots", +] + +[[package]] +name = "js-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "log" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" + +[[package]] +name = "once_cell" +version = "1.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "web-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ba3d009 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "alterware-launcher" +version = "0.2.0" +edition = "2021" +build = "res/build.rs" + +[profile.release] +opt-level = "s" +panic = "abort" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +http_req = { version = "0.9.0", default-features = false, features = [ + "rust-tls", +] } + +[build-dependencies] +winres = "0.1.12" + +[package.metadata.winres] +OriginalFilename = "alterware-launcher.exe" +FileDescription = "AlterWare mod updater & launcher" +ProductName = "AlterWare Launcher" \ No newline at end of file diff --git a/My Project/Resources.Designer.vb b/My Project/Resources.Designer.vb deleted file mode 100644 index 4ee176a..0000000 --- a/My Project/Resources.Designer.vb +++ /dev/null @@ -1,63 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:4.0.30319.42000 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ''' - ''' A strongly-typed resource class, for looking up localized strings, etc. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Returns the cached ResourceManager instance used by this class. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("alterware_launcher.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Overrides the current thread's CurrentUICulture property for all - ''' resource lookups using this strongly typed resource class. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - End Module -End Namespace diff --git a/My Project/Resources.resx b/My Project/Resources.resx deleted file mode 100644 index 26a50bd..0000000 --- a/My Project/Resources.resx +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Program.vb b/Program.vb deleted file mode 100644 index 0d27d40..0000000 --- a/Program.vb +++ /dev/null @@ -1,40 +0,0 @@ -Imports System -Imports System.IO -Imports System.Net -Imports System.Net.Http - -Module Program - Private master As String = "https://master.alterware.dev" - - Sub download_and_run(game As String) - Dim filename As String = game & ".exe" - Dim remote_path As String = If(game = "iw4-sp", "/iw4/", "/iw5/") - Console.WriteLine("Downloading " & game & "...") - Using wc As New WebClient - wc.DownloadFile(master & remote_path & filename, filename) - End Using - Console.WriteLine("Starting " & game) - Dim p As Process = Process.Start(filename) - p.WaitForExit() - End - End Sub - - Sub Main(args As String()) - Dim game As String - Try - game = args(0) - Catch ex As Exception - If File.Exists("iw4sp.exe") Or File.Exists("iw4mp.exe") Then - game = "iw4-sp" - ElseIf File.Exists("iw5sp.exe") Or File.Exists("iw5mp.exe") Or File.Exists("iw5mp_server.exe") Then - game = "iw5-mod" - Else - Console.WriteLine("No game specified nor found in local directory") - Console.ReadLine() - Return - End If - End Try - - download_and_run(game) - End Sub -End Module \ No newline at end of file diff --git a/alterware-launcher.sln b/alterware-launcher.sln deleted file mode 100644 index 4f82c39..0000000 --- a/alterware-launcher.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.33530.505 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "alterware-launcher", "alterware-launcher.vbproj", "{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9C3806A8-30BF-4467-A257-B01E592BBF6E} - EndGlobalSection -EndGlobal diff --git a/alterware-launcher.vbproj b/alterware-launcher.vbproj deleted file mode 100644 index e54d648..0000000 --- a/alterware-launcher.vbproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - Exe - alterware_launcher - net6.0 - true - win-x64 - true - icon.ico - AlterWare iw4-sp/iw5-mod updater - https://github.com/mxve/alterware-launcher - icon.png - git - 0.1.1 - 0.1.0 - - - - - - - - - True - \ - - - - - - True - True - Resources.resx - - - - - - My.Resources - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - - - - diff --git a/icon_bg.ico b/icon_bg.ico deleted file mode 100644 index 46bb474a5c43b4346b8503e02808b9a6d156fbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120364 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 diff --git a/res/build.rs b/res/build.rs new file mode 100644 index 0000000..02edd90 --- /dev/null +++ b/res/build.rs @@ -0,0 +1,16 @@ +#[cfg(windows)] +extern crate winres; + +#[cfg(windows)] +fn main() { + let mut res = winres::WindowsResource::new(); + res.set_icon("res/icon.ico").set_language(0x0409); + + if let Err(e) = res.compile() { + eprintln!("{}", e); + std::process::exit(1); + } +} + +#[cfg(unix)] +fn main() {} diff --git a/icon.ico b/res/icon.ico similarity index 100% rename from icon.ico rename to res/icon.ico diff --git a/src/http.rs b/src/http.rs new file mode 100644 index 0000000..e59fc44 --- /dev/null +++ b/src/http.rs @@ -0,0 +1,25 @@ +use std::{fs, io::Write, path::Path, str}; + +pub fn get_body(url: &str) -> Vec { + let mut res: Vec = Vec::new(); + http_req::request::get(url, &mut res).unwrap_or_else(|error| { + panic!("\n\n{}:\n{:?}", "Error", error); + }); + + res +} + +pub fn _get_body_string(url: &str) -> String { + String::from_utf8(get_body(url)).unwrap() +} + +pub fn download_file(url: &str, file_path: &Path) { + let body = get_body(url); + + let mut f = fs::File::create(file_path).unwrap_or_else(|error| { + panic!("\n\n{}:\n{:?}", "Error", error); + }); + f.write_all(&body).unwrap_or_else(|error| { + panic!("\n\n{}:\n{:?}", "Error", error); + }); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d8e6dcd --- /dev/null +++ b/src/main.rs @@ -0,0 +1,49 @@ +mod http; +use std::path::PathBuf; + +const MASTER: &str = "https://master.alterware.dev"; + +fn download_and_launch(url: &str, file_path: &PathBuf) { + http::download_file(url, file_path); + std::process::Command::new(file_path) + .spawn() + .unwrap() + .wait() + .unwrap(); +} + +fn main() { + let args: Vec = std::env::args().collect(); + let game: String; + if args.len() > 1 { + game = String::from(&args[1]); + } else { + // check if iw4sp.exe or iw4mp.exe exists + if std::path::Path::new("iw4sp.exe").exists() || std::path::Path::new("iw4mp.exe").exists() + { + game = String::from("iw4-sp"); + } else if std::path::Path::new("iw5sp.exe").exists() + || std::path::Path::new("iw5mp.exe").exists() + || std::path::Path::new("iw5mp_server.exe").exists() + { + game = String::from("iw5-mod"); + } else { + println!("No game specified and no game found in current directory"); + return; + } + } + + if game == "iw4-sp" { + download_and_launch( + &format!("{}/iw4/iw4-sp.exe", MASTER), + &PathBuf::from("iw4-sp.exe"), + ); + } else if game == "iw5-mod" { + download_and_launch( + &format!("{}/iw5/iw5-mod.exe", MASTER), + &PathBuf::from("iw5-mod.exe"), + ); + } else { + println!("Invalid game"); + } +}