Last active
August 20, 2021 01:48
-
-
Save Damian972/eb0b35f00f963c7f0b7b6dee64e05e84 to your computer and use it in GitHub Desktop.
Simple script that allows you to update the "detours_r5" and "scripts_r5" assets for Apex R5Reloaded
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Name: R5_Reloaded_Updater | |
* Author: Damian972 | |
* Version: 1.0. | |
*/ | |
ini_set('memory_limit', '256M'); | |
ini_set('user_agent', 'Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'); | |
const CACHE_DIRECTORY = __DIR__.DIRECTORY_SEPARATOR.'r5_updater'; | |
const VERSION_FILE_NAME = '{prefix}_version.txt'; | |
const DELETE_DOWNLOADED_FILES_AFTER_INSTALL = true; | |
const SEVEN_ZIP_BINARY_ABSPATH = 'C:/Program Files/7-Zip/7z.exe'; | |
$assets = [ | |
[ | |
'name' => 'detours_r5', | |
'repo_url' => 'https://github.com/Mauler125/detours_r5', | |
'type' => 'release', | |
'workdir' => '', | |
], | |
[ | |
'name' => 'scripts_r5', | |
'repo_url' => 'https://github.com/Mauler125/scripts_r5', | |
'type' => 'vcs', | |
'workdir' => 'platform/scripts', | |
], | |
]; | |
if (!file_exists(CACHE_DIRECTORY)) { | |
mkdir(CACHE_DIRECTORY, 0777, true); | |
} | |
foreach ($assets as $asset) { | |
try { | |
$workdir = __DIR__.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $asset['workdir']); | |
$localFileVersion = $workdir.DIRECTORY_SEPARATOR.str_replace('{prefix}', $asset['name'], VERSION_FILE_NAME); | |
$hasLocalVersion = file_exists($localFileVersion); | |
echo "[!] Checking {$asset['name']}...".PHP_EOL; | |
echo '[!] Local version found: '.($hasLocalVersion ? 'Yes' : 'No').PHP_EOL; | |
if ($hasLocalVersion) { | |
$localVersion = trim(file_get_contents($localFileVersion)); | |
} | |
[ | |
'name' => $fileName, | |
'link' => $downloadLink, | |
'version' => $lastVersion, | |
'extension' => $fileExtension, | |
] = getMetadata($asset['repo_url'], $asset['type']); | |
if ($hasLocalVersion && $localVersion === $lastVersion) { | |
echo '[!] Update required: No'.PHP_EOL.PHP_EOL; | |
continue; | |
} | |
echo '[*] Update required: Yes'.PHP_EOL.PHP_EOL; | |
$cacheFolder = CACHE_DIRECTORY.DIRECTORY_SEPARATOR.$asset['name']; | |
if (!file_exists($cacheFolder)) { | |
mkdir($cacheFolder, 0777, true); | |
} | |
$downloadFile = "{$fileName}.{$fileExtension}"; | |
$downloadFilePath = $cacheFolder.DIRECTORY_SEPARATOR.$downloadFile; | |
echo "[!] Downloading from {$downloadLink}".PHP_EOL; | |
file_put_contents($downloadFilePath, file_get_contents($downloadLink)); | |
echo "[+] Download finished, see: {$downloadFilePath}".PHP_EOL; | |
$extractedDownloadedFileFolder = $cacheFolder.DIRECTORY_SEPARATOR.$fileName; | |
echo "[!] Extracting into {$extractedDownloadedFileFolder}".PHP_EOL; | |
unzip($downloadFilePath, $cacheFolder); | |
echo PHP_EOL."[!] Copying files into {$workdir}".PHP_EOL; | |
copyDirectory($extractedDownloadedFileFolder, $workdir); | |
// store version identifier in a file | |
file_put_contents($localFileVersion, $lastVersion); | |
if (DELETE_DOWNLOADED_FILES_AFTER_INSTALL) { | |
echo '[-] Removing cached files'.PHP_EOL; | |
removeDirectory($extractedDownloadedFileFolder); | |
unlink($downloadFilePath); | |
} | |
echo PHP_EOL.PHP_EOL; | |
} catch (Exception $e) { | |
echo "[-] {$e->getMessage()}".PHP_EOL; | |
} | |
} | |
echo 'Done!'.PHP_EOL; | |
/** | |
* @param string $type {vcs, release} | |
*/ | |
function getMetadata(string $repositoryUrl, string $type = 'vcs'): array | |
{ | |
$repository = str_replace('https://github.com/', '', $repositoryUrl); | |
[,$repositoryName] = explode('/', $repository); | |
if ('vcs' === $type) { | |
$endpoint = "https://api.github.com/repos/{$repository}"; | |
$json = fetchJson($endpoint); | |
$output = [ | |
'name' => "{$repositoryName}-{$json['default_branch']}", | |
'version' => (new DateTimeImmutable($json['updated_at']))->getTimestamp().'', | |
'link' => "{$json['html_url']}/archive/refs/heads/{$json['default_branch']}.zip", | |
'extension' => 'zip', | |
]; | |
} elseif ('release' === $type) { | |
$endpoint = "https://api.github.com/repos/{$repository}/releases"; | |
$json = fetchJson($endpoint); | |
if (false === $lastRelease = reset($json)) { | |
throw new Exception('No release available.'); | |
} | |
if (false === $lastAsset = reset($lastRelease['assets'])) { | |
throw new Exception('No asset available.'); | |
} | |
$version = preg_replace('"\.(rar|zip)$"', '', $lastAsset['name']); | |
$output = [ | |
'name' => $version, | |
'version' => $version, | |
'link' => $lastAsset['browser_download_url'], | |
'extension' => substr(strrchr($lastAsset['browser_download_url'], '.'), 1), | |
]; | |
} else { | |
throw new InvalidArgumentException('Unsupported metadata type'); | |
} | |
return $output; | |
} | |
function fetchJson(string $url): array | |
{ | |
$json = json_decode(file_get_contents($url), true); | |
if (!is_array($json)) { | |
throw new RuntimeException('Invalid JSON'); | |
} | |
return $json; | |
} | |
function unzip(string $filePath, string $destination): void | |
{ | |
echo exec('"'.SEVEN_ZIP_BINARY_ABSPATH.'"'.' x -y -o"'.$destination.'" '.$filePath).PHP_EOL; | |
} | |
function removeDirectory(string $directory): void | |
{ | |
if (false === $files = scandir($directory)) { | |
throw new RuntimeException('Unable to scan directory "'.$directory.'"'); | |
} | |
foreach ($files as $file) { | |
if ('.' === $file || '..' === $file) { | |
continue; | |
} | |
if (is_dir($directory.DIRECTORY_SEPARATOR.$file)) { | |
removeDirectory($directory.DIRECTORY_SEPARATOR.$file); | |
continue; | |
} | |
unlink($directory.DIRECTORY_SEPARATOR.$file); | |
} | |
rmdir($directory); | |
} | |
function copyDirectory(string $source, string $destination): void | |
{ | |
if (false === $files = scandir($source)) { | |
throw new RuntimeException('Unable to scan directory "'.$source.'"'); | |
} | |
if (!file_exists($destination)) { | |
mkdir($destination, 0777, true); | |
} | |
foreach ($files as $file) { | |
if ('.' === $file || '..' === $file) { | |
continue; | |
} | |
if (is_dir($source.DIRECTORY_SEPARATOR.$file)) { | |
copyDirectory($source.DIRECTORY_SEPARATOR.$file, $destination.DIRECTORY_SEPARATOR.$file); | |
continue; | |
} | |
copy($source.DIRECTORY_SEPARATOR.$file, $destination.DIRECTORY_SEPARATOR.$file); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment