mirror of
https://github.com/cyberarm/w3d_hub_linux_launcher.git
synced 2026-09-19 06:43:55 +00:00
175 lines
3.7 KiB
Ruby
175 lines
3.7 KiB
Ruby
module W3DHubLauncher
|
|
class Task
|
|
attr_reader :request_id, :application, :channel, :installed_version, :target_version
|
|
|
|
def initialize(request_id:, application:, channel:, installed_version:, target_version:)
|
|
@request_id = request_id
|
|
@application = application
|
|
@channel = channel
|
|
@installed_version = installed_version
|
|
@target_version = target_version
|
|
|
|
pp self
|
|
|
|
@manifests = {}
|
|
|
|
setup
|
|
end
|
|
|
|
def setup
|
|
end
|
|
|
|
def start(worker)
|
|
@worker = worker
|
|
|
|
execute
|
|
end
|
|
|
|
def abort_task!(reason = "")
|
|
puts reason
|
|
|
|
raise reason
|
|
end
|
|
|
|
# high level methods
|
|
|
|
def fetch_manifests(version = @target_version)
|
|
while (manifest = fetch_manifest(version))
|
|
@manifests[version] = manifest
|
|
|
|
version = manifest.base_version
|
|
break unless version
|
|
break if manifest.full?
|
|
end
|
|
end
|
|
|
|
def build_package_list
|
|
channel_manifests = []
|
|
version = @target_version
|
|
|
|
while(manifest = @manifests[version])
|
|
channel_manifests << manifest
|
|
|
|
break if manifest.full?
|
|
|
|
version = manifest.base_version
|
|
end
|
|
|
|
files = []
|
|
deleted_files = []
|
|
channel_manifests.reverse.each do |manifest|
|
|
manifest.files.each do |file|
|
|
if file.removed?
|
|
files.delete_if { |f| f.name.casecmp?(file.name) }
|
|
deleted_files << file
|
|
|
|
next
|
|
end
|
|
|
|
# remove files that are total replacements, not patches
|
|
files.delete_if { |f| f.name.casecmp?(file.name) } unless file.patch?
|
|
|
|
# add file to file list
|
|
files << file
|
|
end
|
|
end
|
|
|
|
pp [:files, files.map(&:name), :deleted_files, deleted_files.map(&:name)]
|
|
end
|
|
|
|
def remove_deleted_files
|
|
end
|
|
|
|
def verify_files
|
|
end
|
|
|
|
def fetch_packages
|
|
end
|
|
|
|
def install_packages
|
|
end
|
|
|
|
# helper functions
|
|
|
|
def fetch_manifest(version)
|
|
result = @worker.w3dhub_api.fetch_package_details([
|
|
{
|
|
category: "games",
|
|
subcategory: @application.id,
|
|
name: "manifest.xml",
|
|
version: version
|
|
}
|
|
])
|
|
|
|
return result unless result.okay?
|
|
|
|
response = JSON.parse(result.data)
|
|
package_details = response["packages"]&.map { |item| Worker::Api::LegacyManifestPackage.new(item) }&.first
|
|
|
|
if package_details.nil? || package_details.error?
|
|
pp package_details
|
|
abort_task!("Failed to fetch package details for manifest #{version}")
|
|
end
|
|
|
|
# FIXME: check if locally downloaded manifest is still valid, if present.
|
|
result = if package_details.download_url
|
|
@worker.w3dhub_api.download(package_details.download_url, path: "manifest-#{version}.xml")
|
|
else
|
|
# TODO xD
|
|
@worker.w3dhub_api.fetch_package("TODO")
|
|
end
|
|
|
|
if result.okay?
|
|
return Worker::Api::LegacyManifest.new("manifest-#{version}.xml")
|
|
else
|
|
abort_task!("Failed to fetch manifest #{version}")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# def execute_task
|
|
# show_application_taskbar
|
|
|
|
# fail_fast
|
|
# return false if failed?
|
|
|
|
# fetch_manifests
|
|
# return false if failed?
|
|
|
|
# build_package_list
|
|
# return false if failed?
|
|
|
|
# remove_deleted_files
|
|
# return false if failed?
|
|
|
|
# verify_files
|
|
# return false if failed?
|
|
|
|
# fetch_packages
|
|
# return false if failed?
|
|
|
|
# verify_packages
|
|
# return false if failed?
|
|
|
|
# unpack_packages
|
|
# return false if failed?
|
|
|
|
# create_wine_prefix
|
|
# return false if failed?
|
|
|
|
# install_dependencies
|
|
# return false if failed?
|
|
|
|
# write_paths_ini
|
|
# return false if failed?
|
|
|
|
# mark_application_installed
|
|
# return false if failed?
|
|
|
|
# sleep 1
|
|
# hide_application_taskbar
|
|
|
|
# true
|
|
# end
|