|
|
|
|
@ -127,36 +127,34 @@ namespace DepotDownloader
|
|
|
|
|
return IsLoggedOn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RequestAppInfo(uint appId, bool bForce = false)
|
|
|
|
|
public async Task RequestAppInfo(uint appId, bool bForce = false)
|
|
|
|
|
{
|
|
|
|
|
if ((AppInfo.ContainsKey(appId) && !bForce) || bAborted)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var completed = false;
|
|
|
|
|
Action<SteamApps.PICSTokensCallback> cbMethodTokens = appTokens =>
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
if (appTokens.AppTokensDenied.Contains(appId))
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Insufficient privileges to get access token for app {0}", appId);
|
|
|
|
|
}
|
|
|
|
|
var appTokens = await steamApps.PICSGetAccessTokens([appId], []);
|
|
|
|
|
|
|
|
|
|
foreach (var token_dict in appTokens.AppTokens)
|
|
|
|
|
{
|
|
|
|
|
this.AppTokens[token_dict.Key] = token_dict.Value;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if (appTokens.AppTokensDenied.Contains(appId))
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Insufficient privileges to get access token for app {0}", appId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
foreach (var token_dict in appTokens.AppTokens)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.PICSGetAccessTokens(new List<uint> { appId }, new List<uint>()), cbMethodTokens);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
this.AppTokens[token_dict.Key] = token_dict.Value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
completed = false;
|
|
|
|
|
Action<SteamApps.PICSProductInfoCallback> cbMethod = appInfo =>
|
|
|
|
|
var request = new SteamApps.PICSRequest(appId);
|
|
|
|
|
|
|
|
|
|
if (AppTokens.TryGetValue(appId, out var token))
|
|
|
|
|
{
|
|
|
|
|
completed = !appInfo.ResponsePending;
|
|
|
|
|
request.AccessToken = token;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var appInfoMultiple = await steamApps.PICSGetProductInfo([request], []);
|
|
|
|
|
|
|
|
|
|
foreach (var appInfo in appInfoMultiple.Results)
|
|
|
|
|
{
|
|
|
|
|
foreach (var app_value in appInfo.Apps)
|
|
|
|
|
{
|
|
|
|
|
var app = app_value.Value;
|
|
|
|
|
@ -169,45 +167,17 @@ namespace DepotDownloader
|
|
|
|
|
{
|
|
|
|
|
AppInfo[app] = null;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var request = new SteamApps.PICSRequest(appId);
|
|
|
|
|
if (AppTokens.TryGetValue(appId, out var token))
|
|
|
|
|
{
|
|
|
|
|
request.AccessToken = token;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.PICSGetProductInfo(new List<SteamApps.PICSRequest> { request }, new List<SteamApps.PICSRequest>()), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RequestPackageInfo(IEnumerable<uint> packageIds)
|
|
|
|
|
public async Task RequestPackageInfo(IEnumerable<uint> packageIds)
|
|
|
|
|
{
|
|
|
|
|
var packages = packageIds.ToList();
|
|
|
|
|
packages.RemoveAll(pid => PackageInfo.ContainsKey(pid));
|
|
|
|
|
packages.RemoveAll(PackageInfo.ContainsKey);
|
|
|
|
|
|
|
|
|
|
if (packages.Count == 0 || bAborted)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var completed = false;
|
|
|
|
|
Action<SteamApps.PICSProductInfoCallback> cbMethod = packageInfo =>
|
|
|
|
|
{
|
|
|
|
|
completed = !packageInfo.ResponsePending;
|
|
|
|
|
|
|
|
|
|
foreach (var package_value in packageInfo.Packages)
|
|
|
|
|
{
|
|
|
|
|
var package = package_value.Value;
|
|
|
|
|
PackageInfo[package.ID] = package;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var package in packageInfo.UnknownPackages)
|
|
|
|
|
{
|
|
|
|
|
PackageInfo[package] = null;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var packageRequests = new List<SteamApps.PICSRequest>();
|
|
|
|
|
|
|
|
|
|
foreach (var package in packages)
|
|
|
|
|
@ -222,55 +192,46 @@ namespace DepotDownloader
|
|
|
|
|
packageRequests.Add(request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
var packageInfoMultiple = await steamApps.PICSGetProductInfo([], packageRequests);
|
|
|
|
|
|
|
|
|
|
foreach (var packageInfo in packageInfoMultiple.Results)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.PICSGetProductInfo(new List<SteamApps.PICSRequest>(), packageRequests), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
foreach (var package_value in packageInfo.Packages)
|
|
|
|
|
{
|
|
|
|
|
var package = package_value.Value;
|
|
|
|
|
PackageInfo[package.ID] = package;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var package in packageInfo.UnknownPackages)
|
|
|
|
|
{
|
|
|
|
|
PackageInfo[package] = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool RequestFreeAppLicense(uint appId)
|
|
|
|
|
public async Task<bool> RequestFreeAppLicense(uint appId)
|
|
|
|
|
{
|
|
|
|
|
var success = false;
|
|
|
|
|
var completed = false;
|
|
|
|
|
Action<SteamApps.FreeLicenseCallback> cbMethod = resultInfo =>
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
success = resultInfo.GrantedApps.Contains(appId);
|
|
|
|
|
};
|
|
|
|
|
var resultInfo = await steamApps.RequestFreeLicense(appId);
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.RequestFreeLicense(appId), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
|
|
|
|
|
return success;
|
|
|
|
|
return resultInfo.GrantedApps.Contains(appId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RequestDepotKey(uint depotId, uint appid = 0)
|
|
|
|
|
public async Task RequestDepotKey(uint depotId, uint appid = 0)
|
|
|
|
|
{
|
|
|
|
|
if (DepotKeys.ContainsKey(depotId) || bAborted)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var completed = false;
|
|
|
|
|
var depotKey = await steamApps.GetDepotDecryptionKey(depotId, appid);
|
|
|
|
|
|
|
|
|
|
Action<SteamApps.DepotKeyCallback> cbMethod = depotKey =>
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
Console.WriteLine("Got depot key for {0} result: {1}", depotKey.DepotID, depotKey.Result);
|
|
|
|
|
Console.WriteLine("Got depot key for {0} result: {1}", depotKey.DepotID, depotKey.Result);
|
|
|
|
|
|
|
|
|
|
if (depotKey.Result != EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
Abort();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DepotKeys[depotKey.DepotID] = depotKey.DepotKey;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
if (depotKey.Result != EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.GetDepotDecryptionKey(depotId, appid), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
Abort();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DepotKeys[depotKey.DepotID] = depotKey.DepotKey;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -312,86 +273,49 @@ namespace DepotDownloader
|
|
|
|
|
completion.TrySetResult(cdnAuth);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void CheckAppBetaPassword(uint appid, string password)
|
|
|
|
|
public async Task CheckAppBetaPassword(uint appid, string password)
|
|
|
|
|
{
|
|
|
|
|
var completed = false;
|
|
|
|
|
Action<SteamApps.CheckAppBetaPasswordCallback> cbMethod = appPassword =>
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
var appPassword = await steamApps.CheckAppBetaPassword(appid, password);
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("Retrieved {0} beta keys with result: {1}", appPassword.BetaPasswords.Count, appPassword.Result);
|
|
|
|
|
Console.WriteLine("Retrieved {0} beta keys with result: {1}", appPassword.BetaPasswords.Count, appPassword.Result);
|
|
|
|
|
|
|
|
|
|
foreach (var entry in appPassword.BetaPasswords)
|
|
|
|
|
{
|
|
|
|
|
AppBetaPasswords[entry.Key] = entry.Value;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
foreach (var entry in appPassword.BetaPasswords)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamApps.CheckAppBetaPassword(appid, password), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
AppBetaPasswords[entry.Key] = entry.Value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PublishedFileDetails GetPublishedFileDetails(uint appId, PublishedFileID pubFile)
|
|
|
|
|
public async Task<PublishedFileDetails> GetPublishedFileDetails(uint appId, PublishedFileID pubFile)
|
|
|
|
|
{
|
|
|
|
|
var pubFileRequest = new CPublishedFile_GetDetails_Request { appid = appId };
|
|
|
|
|
pubFileRequest.publishedfileids.Add(pubFile);
|
|
|
|
|
|
|
|
|
|
var completed = false;
|
|
|
|
|
PublishedFileDetails details = null;
|
|
|
|
|
|
|
|
|
|
Action<SteamUnifiedMessages.ServiceMethodResponse> cbMethod = callback =>
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
if (callback.Result == EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
var response = callback.GetDeserializedResponse<CPublishedFile_GetDetails_Response>();
|
|
|
|
|
details = response.publishedfiledetails.FirstOrDefault();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"EResult {(int)callback.Result} ({callback.Result}) while retrieving file details for pubfile {pubFile}.");
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
var callback = await steamPublishedFile.SendMessage(api => api.GetDetails(pubFileRequest));
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
if (callback.Result == EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamPublishedFile.SendMessage(api => api.GetDetails(pubFileRequest)), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
var response = callback.GetDeserializedResponse<CPublishedFile_GetDetails_Response>();
|
|
|
|
|
return response.publishedfiledetails.FirstOrDefault();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return details;
|
|
|
|
|
throw new Exception($"EResult {(int)callback.Result} ({callback.Result}) while retrieving file details for pubfile {pubFile}.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public SteamCloud.UGCDetailsCallback GetUGCDetails(UGCHandle ugcHandle)
|
|
|
|
|
public async Task<SteamCloud.UGCDetailsCallback> GetUGCDetails(UGCHandle ugcHandle)
|
|
|
|
|
{
|
|
|
|
|
var completed = false;
|
|
|
|
|
SteamCloud.UGCDetailsCallback details = null;
|
|
|
|
|
var callback = await steamCloud.RequestUGCDetails(ugcHandle);
|
|
|
|
|
|
|
|
|
|
Action<SteamCloud.UGCDetailsCallback> cbMethod = callback =>
|
|
|
|
|
if (callback.Result == EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
completed = true;
|
|
|
|
|
if (callback.Result == EResult.OK)
|
|
|
|
|
{
|
|
|
|
|
details = callback;
|
|
|
|
|
}
|
|
|
|
|
else if (callback.Result == EResult.FileNotFound)
|
|
|
|
|
{
|
|
|
|
|
details = null;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"EResult {(int)callback.Result} ({callback.Result}) while retrieving UGC details for {ugcHandle}.");
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
WaitUntilCallback(() =>
|
|
|
|
|
return callback;
|
|
|
|
|
}
|
|
|
|
|
else if (callback.Result == EResult.FileNotFound)
|
|
|
|
|
{
|
|
|
|
|
callbacks.Subscribe(steamCloud.RequestUGCDetails(ugcHandle), cbMethod);
|
|
|
|
|
}, () => { return completed; });
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return details;
|
|
|
|
|
throw new Exception($"EResult {(int)callback.Result} ({callback.Result}) while retrieving UGC details for {ugcHandle}.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ResetConnectionFlags()
|
|
|
|
|
|