private static string GetBrowserDownloadUrl(string dataString) { var jsonData = DivinityJsonUtils.SafeDeserialize <Dictionary <string, object> >(dataString); if (jsonData != null) { if (jsonData.TryGetValue("assets", out var assetsArray)) { JArray assets = (JArray)assetsArray; foreach (var obj in assets.Children <JObject>()) { if (obj.TryGetValue("browser_download_url", StringComparison.OrdinalIgnoreCase, out var browserUrl)) { return(browserUrl.ToString()); } } } #if DEBUG var lines = jsonData.Select(kvp => kvp.Key + ": " + kvp.Value.ToString()); DivinityApp.Log($"Can't find 'browser_download_url' in:\n{String.Join(Environment.NewLine, lines)}"); #endif } return(""); }
public static async Task <int> LoadAllWorkshopDataAsync(List <DivinityModData> workshopMods, DivinityModManagerCachedWorkshopData cachedData) { if (workshopMods == null || workshopMods.Count == 0) { return(0); } //var workshopMods = mods.Where(x => !String.IsNullOrEmpty(x.WorkshopData.ID)).ToList(); var values = new Dictionary <string, string> { { "itemcount", workshopMods.Count.ToString() } }; int i = 0; foreach (var mod in workshopMods) { values.Add($"publishedfileids[{i}]", mod.WorkshopData.ID); i++; } Trace.WriteLine($"Updating workshop data for mods."); string responseData = ""; try { var content = new FormUrlEncodedContent(values); var response = await WebHelper.Client.PostAsync(STEAM_API_GET_WORKSHOP_DATA_URL, content); responseData = await response.Content.ReadAsStringAsync(); } catch (Exception ex) { Trace.WriteLine($"Error requesting Steam API to get workshop mod data:\n{ex.ToString()}"); } int totalLoaded = 0; if (!String.IsNullOrEmpty(responseData)) { PublishedFileDetailsResponse pResponse = DivinityJsonUtils.SafeDeserialize <PublishedFileDetailsResponse>(responseData); if (pResponse != null && pResponse.response != null && pResponse.response.publishedfiledetails != null && pResponse.response.publishedfiledetails.Count > 0) { var details = pResponse.response.publishedfiledetails; foreach (var d in details) { try { var mod = workshopMods.FirstOrDefault(x => x.WorkshopData.ID == d.publishedfileid); if (mod != null) { mod.WorkshopData.CreatedDate = DateUtils.UnixTimeStampToDateTime(d.time_created); mod.WorkshopData.UpdatedDate = DateUtils.UnixTimeStampToDateTime(d.time_updated); if (d.tags != null && d.tags.Count > 0) { mod.WorkshopData.Tags = GetWorkshopTags(d); mod.AddTags(mod.WorkshopData.Tags); } cachedData.AddOrUpdate(mod.UUID, d, mod.WorkshopData.Tags); //Trace.WriteLine($"Loaded workshop details for mod {mod.Name}:"); totalLoaded++; } } catch (Exception ex) { Trace.WriteLine($"Error parsing mod data for {d.title}({d.publishedfileid})\n{ex.ToString()}"); } } Trace.WriteLine($"Successfully loaded workshop data for {totalLoaded} mods."); } else { Trace.WriteLine("Failed to load workshop data for mods."); Trace.WriteLine($"{responseData}"); } } else { Trace.WriteLine("Failed to load workshop data for mods - no response data."); } return(totalLoaded); }
public static async Task <Unit> LoadAllWorkshopDataAsync(List <DivinityModData> workshopMods) { if (workshopMods.Count == 0) { return(Unit.Default); } //var workshopMods = mods.Where(x => !String.IsNullOrEmpty(x.WorkshopData.ID)).ToList(); var values = new Dictionary <string, string> { { "itemcount", workshopMods.Count.ToString() } }; int i = 0; foreach (var mod in workshopMods) { values.Add($"publishedfileids[{i}]", mod.WorkshopData.ID); i = i + 1; } Trace.WriteLine($"Attempting to get workshop data from mods."); string responseData = ""; try { var content = new FormUrlEncodedContent(values); var response = await WebHelper.Client.PostAsync(STEAM_API_GET_WORKSHOP_DATA_URL, content); responseData = await response.Content.ReadAsStringAsync(); } catch (Exception ex) { Trace.WriteLine($"Error requesting Steam API to get workshop mod data:\n{ex.ToString()}"); } if (!String.IsNullOrEmpty(responseData)) { PublishedFileDetailsResponse pResponse = DivinityJsonUtils.SafeDeserialize <PublishedFileDetailsResponse>(responseData); if (pResponse != null && pResponse.response != null && pResponse.response.publishedfiledetails != null && pResponse.response.publishedfiledetails.Count > 0) { int totalLoaded = 0; var details = pResponse.response.publishedfiledetails; foreach (var d in details) { try { var mod = workshopMods.FirstOrDefault(x => x.WorkshopData.ID == d.publishedfileid); if (mod != null) { if (d.tags != null && d.tags.Count > 0) { mod.WorkshopData.Tags = d.tags.Select(x => x.tag).ToList(); //Trace.WriteLine($"Tags: {String.Join(";", mod.WorkshopData.Tags)}"); } mod.WorkshopData.PreviewUrl = d.preview_url; mod.WorkshopData.Title = d.title; mod.WorkshopData.Description = d.description; mod.WorkshopData.CreatedDate = DateUtils.UnixTimeStampToDateTime(d.time_created); mod.WorkshopData.UpdatedDate = DateUtils.UnixTimeStampToDateTime(d.time_updated); mod.WorkshopData.Subscriptions = d.subscriptions; mod.WorkshopData.LifetimeSubscriptions = d.lifetime_subscriptions; mod.WorkshopData.Favorites = d.favorited; mod.WorkshopData.LifetimeFavorites = d.lifetime_favorited; mod.WorkshopData.Views = d.views; //Trace.WriteLine($"Loaded workshop details for mod {mod.Name}:"); totalLoaded++; } } catch (Exception ex) { Trace.WriteLine($"Error parsing mod data for {d.title}({d.publishedfileid})\n{ex.ToString()}"); } } Trace.WriteLine($"Successfully loaded workshop data for {totalLoaded} mods."); } else { Trace.WriteLine("Failed to load workshop data for mods."); Trace.WriteLine($"{responseData}"); } } else { Trace.WriteLine("Failed to load workshop data for mods - no response data."); } return(Unit.Default); }