From 86d02dde3c82b0e138f2c02618ff0065e20782cc Mon Sep 17 00:00:00 2001 From: amd64fox <62529699+amd64fox@users.noreply.github.com> Date: Fri, 14 Nov 2025 00:17:15 +0300 Subject: [PATCH] added build type processing --- .github/workflows/version-check.yml | 70 ++++++++++++++++++- LoaderSpot_CLI/src/main.rs | 105 ++++------------------------ get-build-info.ps1 | 95 +++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 94 deletions(-) create mode 100644 get-build-info.ps1 diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml index 636243f..e84cdca 100644 --- a/.github/workflows/version-check.yml +++ b/.github/workflows/version-check.yml @@ -8,9 +8,10 @@ concurrency: cancel-in-progress: false jobs: - build: + version-search: runs-on: ubuntu-latest - + outputs: + versions: ${{ steps.search.outputs.versions }} steps: - name: Checkout repository uses: actions/checkout@v5 @@ -23,9 +24,72 @@ jobs: chmod +x loaderspot_cli - name: Version search + id: search if: github.event.client_payload.v && github.event.client_payload.s env: v: ${{ github.event.client_payload.v }} s: ${{ github.event.client_payload.s }} + run: | + json_output=$(./loaderspot_cli --version "$v" --connections 300 --ladder-search) + echo "versions=$json_output" >> $GITHUB_OUTPUT + + get-build-type: + runs-on: windows-latest + needs: version-search + if: success() && needs.version-search.outputs.versions + continue-on-error: true + outputs: + build_type: ${{ steps.get_build_type.outputs.build_type }} + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Get Win64 URL and determine build type + id: get_build_type + shell: pwsh + run: | + $versionsJson = '${{ needs.version-search.outputs.versions }}' | ConvertFrom-Json + $win64Url = $versionsJson.WIN64 + if ($win64Url) { + ./get-build-info.ps1 -Url $win64Url + } else { + echo "::set-output name=build_type::false" + } + + send-to-gas: + runs-on: ubuntu-latest + needs: [version-search, get-build-type] + if: success() && needs.version-search.outputs.versions + steps: + - name: Send data to Google Apps Script + env: g: ${{ secrets.GOOGLE_APPS_URL }} - run: ./loaderspot_cli --version "$v" --source "$s" --gas-url "$g" --connections 300 + versions: ${{ needs.version-search.outputs.versions }} + build_type: ${{ needs.get-build-type.outputs.build_type }} + source: ${{ github.event.client_payload.s }} + run: | + if [ -z "$versions" ]; then + echo "Versions data is empty. Skipping." + exit 0 + fi + + if [ "$build_type" = "false" ]; then + final_json=$(echo "$versions" | jq \ + --argjson buildType false \ + --arg source "$source" \ + '. + {buildType: $buildType, source: $source}') + else + final_json=$(echo "$versions" | jq \ + --arg buildType "$build_type" \ + --arg source "$source" \ + '. + {buildType: $buildType, source: $source}') + fi + + response=$(curl -s -L -X POST "$g" -H "Content-Type: application/json" --data-raw "$final_json") + + if echo "$response" | grep -q "text-align:center"; then + clean_response=$(echo "$response" | grep "text-align:center" | sed 's/<[^>]*>//g' | xargs) + echo "Ответ от GAS: $clean_response" + else + echo "Ответ от GAS: $response" + fi diff --git a/LoaderSpot_CLI/src/main.rs b/LoaderSpot_CLI/src/main.rs index 24cfe06..152bae5 100644 --- a/LoaderSpot_CLI/src/main.rs +++ b/LoaderSpot_CLI/src/main.rs @@ -7,7 +7,6 @@ use std::sync::Arc; use std::time::Duration; use tokio::sync::Semaphore; use regex::Regex; -use scraper::{Html, Selector}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] enum PlatformArch { @@ -149,13 +148,9 @@ struct Cli { #[clap(long, default_value_t = 100)] connections: usize, - /// URL to send the found versions to (Google Apps Script) + /// Use ladder search algorithm #[clap(long)] - gas_url: Option, - - /// Source of the version - #[clap(long)] - source: Option, + ladder_search: bool, } fn parse_range(range_str: &str) -> (i32, i32) { @@ -233,8 +228,7 @@ async fn main() { let version_clone = cli.version.clone(); let client_clone = client.clone(); - let gas_url_clone = cli.gas_url.clone(); - let source_clone = cli.source.clone(); + let ladder_search = cli.ladder_search; let search_task = tokio::spawn(async move { let mut all_found_urls = Vec::new(); @@ -249,7 +243,7 @@ async fn main() { arches_to_search.retain(|&p| p != PlatformArch::WinX86); } - if gas_url_clone.is_some() && source_clone.is_some() { + if ladder_search { // "Лесенка" let mut start_number = 0; let mut before_enter = 1000; @@ -264,10 +258,10 @@ async fn main() { // Дополнительные поиски for _ in 0..additional_searches { - let latest_urls = get_latest_urls(&all_found_urls, &[version.to_string()], source_clone.as_deref().unwrap_or("")); + let latest_urls = get_latest_urls(&all_found_urls); let target_len = arches_to_search.iter().filter(|&&p| p != PlatformArch::WinX86 || should_use_win_x86(version)).count(); - if latest_urls.len() >= target_len + 2 { // +2 for version and source + if latest_urls.len() >= target_len { break; } @@ -302,33 +296,16 @@ async fn main() { pb.finish_and_clear(); - match (&cli.gas_url, &cli.source) { - (Some(gas_url), Some(source)) => { - let latest_urls = get_latest_urls(&all_found_urls, &cli.version, source); - send_to_gas(client, gas_url, latest_urls).await; - } - (Some(_), None) => { - eprintln!("Warning: --gas-url is provided, but --source is missing. Skipping sending to GAS."); - let json_output = serde_json::to_string_pretty(&all_found_urls).unwrap(); - println!("{}", json_output); - } - (None, Some(_)) => { - eprintln!("Warning: --source is provided, but --gas-url is missing. Skipping sending to GAS."); - let json_output = serde_json::to_string_pretty(&all_found_urls).unwrap(); - println!("{}", json_output); - } - (None, None) => { - let json_output = serde_json::to_string_pretty(&all_found_urls).unwrap(); - println!("{}", json_output); - } + let mut latest_urls = get_latest_urls(&all_found_urls); + if !cli.version.is_empty() { + latest_urls.insert("version".to_string(), cli.version.join(", ")); } + + let json_output = serde_json::to_string_pretty(&latest_urls).unwrap(); + println!("{}", json_output); } -fn get_latest_urls( - found_urls: &[(String, PlatformArch)], - versions: &[String], - source: &str, -) -> HashMap { +fn get_latest_urls(found_urls: &[(String, PlatformArch)]) -> HashMap { let mut platform_urls = HashMap::new(); let version_pattern = Regex::new(r"-(\d+)\.(exe|tbz)$").unwrap(); @@ -347,70 +324,16 @@ fn get_latest_urls( } } - let mut latest_urls: HashMap = platform_urls + let latest_urls: HashMap = platform_urls .into_iter() .map(|(k, (v, _))| (k, v)) .collect(); - if !versions.is_empty() { - latest_urls.insert("version".to_string(), versions.join(", ")); - } - - latest_urls.insert("source".to_string(), source.to_string()); - - if latest_urls.is_empty() { let mut empty_map = HashMap::new(); empty_map.insert("unknown".to_string(), "unknown".to_string()); - if !versions.is_empty() { - empty_map.insert("version".to_string(), versions.join(", ")); - } - empty_map.insert("source".to_string(), source.to_string()); return empty_map; } latest_urls } - -async fn send_to_gas( - client: Client, - gas_url: &str, - data: HashMap, -) { - const GAS_ERROR_PREFIX: &str = "Ошибка при отправке в GAS:"; - let cleaned_gas_url = gas_url.trim_matches('"'); - - match client.post(cleaned_gas_url).json(&data).send().await { - Ok(response) => { - if response.status().is_success() { - match response.text().await { - Ok(text) => { - if text.contains("().trim()); - } else { - eprintln!("Не удалось извлечь ответ из HTML. Полный ответ:"); - eprintln!("{}", text); - } - } else { - println!("Ответ от GAS: {}", text.trim()); - } - } - Err(e) => eprintln!("Ошибка чтения ответа от GAS: {}", e), - } - } else { - eprintln!("{} {}", GAS_ERROR_PREFIX, response.status()); - } - } - Err(e) => { - let error_message = e.to_string(); - if let Some(index) = error_message.find(" for url (") { - eprintln!("{} {}", GAS_ERROR_PREFIX, &error_message[..index]); - } else { - eprintln!("{} {}", GAS_ERROR_PREFIX, error_message); - } - } - } -} diff --git a/get-build-info.ps1 b/get-build-info.ps1 new file mode 100644 index 0000000..e84d948 --- /dev/null +++ b/get-build-info.ps1 @@ -0,0 +1,95 @@ +function Find-BuildInfo { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)] + [string]$Path + ) + + process { + try { + $fileContent = Get-Content -Path $Path -ErrorAction Stop + $found = $false + + $regex = '(Master|Release|PR|Local) Build.+(?:cef_)?(\d+\.\d+\.\d+\+g[0-9a-f]+\+chromium-\d+\.\d+\.\d+\.\d+)' + + foreach ($line in $fileContent) { + $match = [regex]::Match($line, $regex) + if ($match.Success) { + $buildType = $match.Groups[1].Value + Write-Output "Тип билда: $buildType" + $found = $true + # Выводим тип билда в специальном формате для GitHub Actions + echo "::set-output name=build_type::$buildType" + # Прерываем цикл после первого найденного совпадения + break + } + } + + if (-not $found) { + Write-Output "Билд не найден" + echo "::set-output name=build_type::false" + } + } + catch { + Write-Error "Ошибка при чтении файла: $_" + echo "::set-output name=build_type::false" + } + } +} + +function Download-And-Unpack-Spotify { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true)] + [string]$Url + ) + + $tempPath = Join-Path ([System.IO.Path]::GetTempPath()) "spotify" + $destinationPath = Join-Path $tempPath "unpacked" + $exePath = Join-Path $tempPath "SpotifySetup.exe" + + if (-not (Test-Path -Path $tempPath)) { + New-Item -ItemType Directory -Path $tempPath | Out-Null + } + if (-not (Test-Path -Path $destinationPath)) { + New-Item -ItemType Directory -Path $destinationPath | Out-Null + } + + try { + Write-Output "Скачивание файла из $Url..." + Invoke-WebRequest -Uri $Url -OutFile $exePath + Write-Output "Файл сохранен в $exePath" + + Write-Output "Распаковка файла в $destinationPath..." + Start-Process -Wait -FilePath $exePath -ArgumentList "/extract `"$destinationPath`"" + Write-Output "Распаковка завершена." + + $dllPath = Join-Path $destinationPath "Spotify.dll" + $exePathForAnalysis = Join-Path $destinationPath "Spotify.exe" + + if (Test-Path $dllPath) { + Find-BuildInfo -Path $dllPath + } elseif (Test-Path $exePathForAnalysis) { + Find-BuildInfo -Path $exePathForAnalysis + } + else { + Write-Error "Файлы Spotify.dll и Spotify.exe не найдены в $destinationPath" + echo "::set-output name=build_type::false" + } + } + catch { + Write-Error "Произошла ошибка: $_" + echo "::set-output name=build_type::false" + } +} + +param ( + [string]$Url +) + +if (-not [string]::IsNullOrEmpty($Url)) { + Download-And-Unpack-Spotify -Url $Url +} else { + Write-Error "URL не был предоставлен." + echo "::set-output name=build_type::false" +} \ No newline at end of file