Example #1
0
        public static async Task <(List <AddonData>, List <AddonData>)> FullProccess(HttpClient httpClient, List <CurseAddon> addons, int tries, List <AddonData> loadedData)
        {
            ConcurrentBag <AddonData> validAddonData    = new ConcurrentBag <AddonData>();
            ConcurrentBag <AddonData> NonValidAddonData = new ConcurrentBag <AddonData>();

            List <Task <AddonData> > addonDataTasks = addons.Select(curseAddon => FromCurseToAddonData(httpClient, curseAddon, tries, loadedData)).ToList();

            AddonData[] addonDatas = await Task.WhenAll(addonDataTasks);

            List <Task> proccessTasks = addonDatas.Select(ad => ProccessAddonData(httpClient, ad).ContinueWith((t) =>
            {
                bool result         = t.Result.Item1;
                AddonData addonData = t.Result.Item2;

                addonData.HasRetail  = addonData.Downloads.Any(d => d.GameVersion.First().ToString() == "8");
                addonData.HasClassic = addonData.Downloads.Any(d => d.GameVersion.First().ToString() == "1");

                if (result)
                {
                    validAddonData.Add(addonData);
                    logger.LogInformation("Match found for: " + addonData.ProjectName + " = " + addonData.FolderName);
                }
                else
                {
                    NonValidAddonData.Add(addonData);
                    logger.LogInformation("No Match found for: " + addonData.ProjectName + " = " + addonData.FolderName);
                }
                addonData.Downloads = new List <Download>();
            })).ToList();
            await Task.WhenAll(proccessTasks);

            return(validAddonData.ToList(), NonValidAddonData.ToList());
        }
Example #2
0
 public StoreAddon(AddonData addonData)
 {
     AddonData       = addonData;
     Updated         = DateTimeOffset.FromUnixTimeSeconds(addonData.UpdatedEpoch).UtcDateTime;
     Created         = DateTimeOffset.FromUnixTimeSeconds(addonData.CreatedEpoch).UtcDateTime;
     UpdatedFormated = Updated.ToString("yyyy'-'MM'-'dd");
     CreatedFormated = Created.ToString("yyyy'-'MM'-'dd");
 }
        private string GetIcon(AddonData addonData)
        {
            try
            {
                if (addonData.Attachments.Count() > 0)
                {
                    return(addonData.Attachments.First().ThumbnailUrl);
                }
            }
            catch (Exception exception)
            {
                Logger.Exception(exception);
            }

            const string defaultIcon = "https://www.macupdate.com/images/icons512/38553.png";

            return(defaultIcon);
        }
Example #4
0
        /// <summary>
        /// Is called to initialize the object; usually after a set of other operations have been performed or if
        /// the right time has come and other required steps have been performed.
        /// </summary>
        public void FinalizeDataHolder()
        {
            if (string.IsNullOrEmpty(DefaultName))
            {
                ContentMgr.OnInvalidDBData("NPCEntry has no name: " + this);
                return;
            }

            if (Titles == null)
            {
                Titles = new string[(int)ClientLocale.End];
            }

            if (DefaultTitle == null)
            {
                DefaultTitle = "";
            }

            if (SpellGroupId != 0 && NPCMgr.PetSpells != null)
            {
                var spells = NPCMgr.PetSpells.Get(SpellGroupId) ?? Spell.EmptyArray;
                foreach (var spell in spells)
                {
                    AddSpell(spell);
                }
            }

            if (MinMana > MaxMana)
            {
                MaxMana = MinMana;
            }

            if (MaxDamage > 0)
            {
                if (MinDamage < 1)
                {
                    MinDamage = 1;
                }
                if (MaxDamage < MinDamage)
                {
                    MaxDamage = MinDamage;
                }
            }

            if (RangedMaxDamage > 0 && RangedMinDamage > 0)
            {
                if (RangedMaxDamage < RangedMinDamage)
                {
                    RangedMaxDamage = RangedMinDamage;
                }
                if (RangedAttackTime == 0)
                {
                    RangedAttackTime = AttackTime;
                }
            }

            AggroBaseRange = AggroBaseRangeDefault;

            NPCId = (NPCId)Id;

            DefaultDecayDelayMillis = _DefaultDecayDelayMillis;
            Family = NPCMgr.GetFamily(FamilyId);

            if (Type == CreatureType.NotSpecified || VehicleEntry != null)
            {
                IsIdle = true;
            }

            if (Type == CreatureType.NotSpecified && UnitFlags.HasFlag((UnitFlags.Passive | UnitFlags.NotSelectable)))
            {
                IsEventTrigger = true;
                IsIdle         = false;
            }

            if (Resistances == null)
            {
                Resistances = new int[ItemConstants.MaxResCount];
            }

            SetFlagIndices = Utility.GetSetIndices((uint)NPCFlags);

            // set/fix factions
            HordeFaction    = FactionMgr.Get(HordeFactionId);
            AllianceFaction = FactionMgr.Get(AllianceFactionId);
            if (HordeFaction == null)
            {
                HordeFaction   = AllianceFaction;
                HordeFactionId = AllianceFactionId;
            }
            else if (AllianceFaction == null)
            {
                AllianceFaction   = HordeFaction;
                AllianceFactionId = HordeFactionId;
            }
            if (AllianceFaction == null)
            {
                ContentMgr.OnInvalidDBData("NPCEntry has no valid Faction: " + this);
                HordeFaction   = AllianceFaction = NPCMgr.DefaultFaction;
                HordeFactionId = AllianceFactionId = (FactionTemplateId)HordeFaction.Template.Id;
            }

            // speeds
            if (SpeedFactor < 0.01)
            {
                SpeedFactor = 1;
            }

            if (WalkSpeed == 0)
            {
                WalkSpeed = NPCMgr.DefaultNPCWalkSpeed * SpeedFactor;
            }
            if (RunSpeed == 0)
            {
                RunSpeed = NPCMgr.DefaultNPCRunSpeed * SpeedFactor;
            }
            if (FlySpeed == 0)
            {
                FlySpeed = NPCMgr.DefaultNPCFlySpeed * SpeedFactor;
            }

            // Add all default spells
            if (FixedSpells != null)
            {
                foreach (var spell in FixedSpells)
                {
                    AddSpell(spell);
                }
            }

            InstanceTypeHandlers = NPCMgr.GetNPCTypeHandlers(this);
            SpawnTypeHandlers    = NPCMgr.GetNPCSpawnTypeHandlers(this);

            //ArrayUtil.PruneVals(ref DisplayIds);

            if (EquipmentId != 0)
            {
                Equipment = NPCMgr.GetEquipment(EquipmentId);
            }

            ModelInfos = new UnitModelInfo[DisplayIds.Length];

            GeneratesXp = (Type != CreatureType.Critter && Type != CreatureType.None && !ExtraFlags.HasFlag(UnitExtraFlags.NoXP));

            var x = 0;

            for (var i = 0; i < DisplayIds.Length; i++)
            {
                var did = DisplayIds[i];
                if (did > 0)
                {
                    var model = UnitMgr.GetModelInfo(did);
                    if (model != null)
                    {
                        ModelInfos[x++] = model;
                    }
                }
            }

            if (x == 0)
            {
                ContentMgr.OnInvalidDBData("NPCEntry has no valid DisplayId: {0} ({1})", this, DisplayIds.ToString(", "));
                return;
            }

            if (TrainerTemplateId != 0)
            {
                if (!NPCMgr.TrainerSpellTemplates.ContainsKey(TrainerTemplateId))
                {
                    ContentMgr.OnInvalidDBData("NPCEntry has invalid TrainerTemplateId: {0} ({1})", this, TrainerTemplateId);
                }
                else
                {
                    if (TrainerEntry == null)
                    {
                        TrainerEntry = new TrainerEntry();
                    }
                    foreach (var trainerSpell in NPCMgr.TrainerSpellTemplates[TrainerTemplateId])
                    {
                        TrainerEntry.AddSpell(trainerSpell);
                    }
                }
            }

            if (AddonData != null)
            {
                AddonData.InitAddonData(this);
            }

            if (x < ModelInfos.Length)
            {
                Array.Resize(ref ModelInfos, x);
            }

            // add to container
            if (Id < NPCMgr.Entries.Length)
            {
                NPCMgr.Entries[Id] = this;
            }
            else
            {
                NPCMgr.CustomEntries[Id] = this;
            }
            ++NPCMgr.EntryCount;

            if (BrainCreator == null)
            {
                BrainCreator = DefaultBrainCreator;
            }

            if (NPCCreator == null)
            {
                NPCCreator = DefaultCreator;
            }
        }
        public static AddonData GetAddonData(string workshopAddonId, bool cacheIgnore = false)
        {
            string currentDirectoryPath = System.AppDomain.CurrentDomain.BaseDirectory;
            string fileCachePath        = Path.Combine(currentDirectoryPath, "cache.json");

            List <AddonData> caches = new List <AddonData>();

            if (!cacheIgnore)
            {
                if (File.Exists(fileCachePath))
                {
                    string fileJson = File.ReadAllText(fileCachePath);
                    caches = JsonConvert.DeserializeObject <List <AddonData> >(fileJson);

                    AddonData getAddonsCache = caches.Find(x => x.Uid == workshopAddonId);
                    if (getAddonsCache != null)
                    {
                        return(getAddonsCache);
                    }
                }
            }

            try
            {
                AddonData    addonData    = new AddonData();
                HtmlDocument htmlDocument = new HtmlDocument();
                string       htmlBody     = null;

                using (WebClient client = new WebClient())
                {
                    htmlBody = client.DownloadString("https://steamcommunity.com/sharedfiles/filedetails/?id=" + workshopAddonId.ToString());
                }

                if (htmlBody == null)
                {
                    return(new AddonData());
                }

                htmlDocument.LoadHtml(htmlBody);

                HtmlNode docNode = htmlDocument.DocumentNode;

                addonData.Title       = docNode.SelectSingleNode("//div[@class='workshopItemTitle']").InnerText;
                addonData.Description = docNode.SelectSingleNode("//div[@class='workshopItemDescription']").InnerText;

                try
                {
                    addonData.ImageUrl = docNode.SelectSingleNode("//img[@id='previewImageMain']").Attributes["src"].Value;
                }
                catch
                {
                    addonData.ImageUrl = docNode.SelectSingleNode("//img[@id='previewImage']").Attributes["src"].Value;
                }

                int workshop_tags_num = 0;
                foreach (HtmlNode workshopTag in docNode.SelectNodes("//div[@class='workshopTags']").Descendants("a"))
                {
                    if (workshop_tags_num <= 1)
                    {
                        addonData.Types.Add(workshopTag.InnerText);
                    }
                    else
                    {
                        addonData.Tags.Add(workshopTag.InnerText);
                    }

                    workshop_tags_num++;
                }

                int workshop_details_num = 0;
                foreach (HtmlNode workshopDetails in docNode.SelectNodes("//div[@class='detailsStatRight']"))
                {
                    if (workshop_details_num == 0)
                    {
                        addonData.FileSize = workshopDetails.InnerText;
                    }

                    if (workshop_details_num == 1)
                    {
                        addonData.UploadDate = workshopDetails.InnerText;
                    }

                    if (workshop_details_num == 2)
                    {
                        addonData.UpdateDate = workshopDetails.InnerText;
                    }

                    workshop_details_num++;
                }

                HtmlNodeCollection cells = docNode.SelectNodes("//table[@class='stats_table']/tr/td");
                addonData.UniqueVisitors = cells[0].InnerText;
                addonData.Subscribers    = cells[2].InnerText;
                addonData.Favorites      = cells[4].InnerText;
                addonData.Uid            = workshopAddonId;

                if (caches.Count == 0 && File.Exists(fileCachePath))
                {
                    string fileJson = File.ReadAllText(fileCachePath);
                    caches = JsonConvert.DeserializeObject <List <AddonData> >(fileJson);
                }

                if (cacheIgnore)
                {
                    bool isExists = false;
                    for (int i = 0; i < caches.Count; i++)
                    {
                        if (caches[i].Uid == workshopAddonId)
                        {
                            caches[i] = addonData;
                            isExists  = true;
                            break;
                        }
                    }

                    if (!isExists)
                    {
                        caches.Add(addonData);
                    }

                    File.WriteAllText(fileCachePath, JsonConvert.SerializeObject(caches, Formatting.Indented));
                }
                else
                {
                    caches.Add(addonData);
                    File.WriteAllText(fileCachePath, JsonConvert.SerializeObject(caches, Formatting.Indented));
                }

                return(addonData);
            }
            catch (Exception ex)
            {
                //Console.WriteLine("Parsing addon webpage error:\n" + ex);
                return(new AddonData());
            }
        }
Example #6
0
        /***** INSTALL *****/

        /// <summary>
        /// Performs archive extraction and file IO operations to install the downloaded addon.
        /// </summary>
        private void Install()
        {
            viewModel.ProgBarLabel = "Installing " + addon_info.addon_name;

            if (addon_info.download_type == "archive")
            {
                if (Directory.Exists(addon_expanded_path))
                {
                    Directory.Delete(addon_expanded_path, true);
                }

                ZipFile.ExtractToDirectory(fileName, addon_expanded_path);


                if (addon_info.install_mode != "arc")
                {
                    FileSystem.CopyDirectory(addon_expanded_path, addon_install_path, true);
                }
                else
                {
                    if (!Directory.Exists(Path.Combine(addon_install_path, "arcdps")))
                    {
                        Directory.CreateDirectory(Path.Combine(addon_install_path, "arcdps"));
                    }

                    File.Copy(Path.Combine(addon_expanded_path, addon_info.plugin_name), Path.Combine(Path.Combine(addon_install_path, "arcdps"), addon_info.plugin_name), true);
                }
            }
            else
            {
                if (addon_info.install_mode != "arc")
                {
                    if (!Directory.Exists(Path.Combine(addon_install_path, addon_info.folder_name)))
                    {
                        Directory.CreateDirectory(Path.Combine(addon_install_path, addon_info.folder_name));
                    }

                    FileSystem.CopyFile(fileName, Path.Combine(Path.Combine(addon_install_path, addon_info.folder_name), Path.GetFileName(fileName)), true);
                }
                else
                {
                    if (!Directory.Exists(Path.Combine(addon_install_path, "arcdps")))
                    {
                        Directory.CreateDirectory(Path.Combine(addon_install_path, "arcdps"));
                    }

                    FileSystem.CopyFile(fileName, Path.Combine(Path.Combine(addon_install_path, "arcdps"), Path.GetFileName(fileName)), true);
                }
            }

            //removing download from temp folder to avoid naming clashes
            FileSystem.DeleteFile(fileName);

            var addonConfig = _configurationManager.UserConfig.AddonsList.FirstOrDefault(a => a.Name == addon_name);

            if (addonConfig != null)
            {
                addonConfig.Version = latestVersion;
            }
            else
            {
                var newAddonConfig = new AddonData {
                    Name = addon_name, Installed = true, Version = latestVersion
                };
                _configurationManager.UserConfig.AddonsList.Add(newAddonConfig);
            }
            _configurationManager.SaveConfiguration();
        }
Example #7
0
        private static async Task <AddonData> FromCurseToAddonData(HttpClient httpClient, CurseAddon curseAddon, int tries, List <AddonData> loadedData)
        {
            List <AddonData> foundDataList = loadedData.Where(ad => ad.ProjectName.Equals(curseAddon.AddonURL)).ToList();

            if (foundDataList.Count == 1)
            {
                AddonData foundData = foundDataList[0];
                foundData.NrOfDownloads = curseAddon.Downloads;
                foundData.UpdatedEpoch  = curseAddon.UpdatedEpoch;
                foundData.CreatedEpoch  = curseAddon.CreatedEpoch;
                foundData.Description   = curseAddon.Description;
                foundData.Title         = curseAddon.Title;

                try
                {
                    foundData.Downloads = await Pure.Version.DownloadVersionsFor(httpClient, foundData.ProjectName);
                }
                catch (Exception e)
                {
                    logger.LogError(e, nameof(FromCurseToAddonData) + " error getting versions");
                }

                AddonData copy = new AddonData()
                {
                    CreatedEpoch  = foundData.CreatedEpoch,
                    Title         = foundData.Title,
                    Description   = foundData.Description,
                    Downloads     = foundData.Downloads,
                    Files         = foundData.Files,
                    FolderName    = foundData.FolderName,
                    NrOfDownloads = foundData.NrOfDownloads,
                    ProjectName   = foundData.ProjectName,
                    Size          = foundData.Size,
                    SubFolders    = foundData.SubFolders,
                    UpdatedEpoch  = foundData.UpdatedEpoch
                };

                return(copy);
            }
            if (foundDataList.Count > 1)
            {
                logger.LogInformation("foundDataList.Count=" + foundDataList.Count + " for " + curseAddon.AddonURL);
            }

            AddonData addonData = curseAddon.toAddonData();

            for (int i = 0; i < tries; i++)
            {
                try
                {
                    addonData.Downloads = await Pure.Version.DownloadVersionsFor(httpClient, addonData.ProjectName);

                    if (addonData.Downloads.Count > 1)
                    {
                        return(addonData);
                    }
                }
                catch (Exception e)
                {
                    logger.LogError(e, nameof(FromCurseToAddonData) + " try: " + i + "/" + tries);
                }
            }

            return(addonData);
        }
Example #8
0
        public static async Task <(bool, AddonData)> ProccessAddonData(HttpClient httpClient, AddonData addonData)
        {
            if (!string.IsNullOrEmpty(addonData.FolderName))
            {
                return(true, addonData);
            }

            bool   found   = false;
            string zipFile = string.Empty;

            try
            {
                zipFile = await Update.DLWithHttpProgress(httpClient, addonData.Downloads[0]);
            }
            catch (Exception e)
            {
                logger.LogError(e, "Something went wrong in " + nameof(ProccessAddonData) + " for " + addonData.ProjectName);
                return(found, addonData);
            }

            if (string.IsNullOrEmpty(zipFile) || !File.Exists(zipFile))
            {
                logger.LogError("No zipFile found for " + addonData.ProjectName);
                return(found, addonData);
            }

            FileInfo fileInfo = new FileInfo(zipFile);

            addonData.Size = fileInfo.Length;

            try
            {
                (int entries, List <string> folders) = Update.UpdateAddon2(zipFile);
                addonData.Files = entries;

                if (folders.Count == 1)
                {
                    addonData.FolderName = folders[0];
                    found = true;
                }
                else
                {
                    foreach (string folder in folders)
                    {
                        string lowered = folder.ToLower();
                        if (PROJECT_URLS.TryGetValue(lowered, out string mapped))
                        {
                            if (mapped.Equals(addonData.ProjectName))
                            {
                                found = true;
                                addonData.FolderName = folder;
                                break;
                            }
                        }
                    }
                    if (!found)
                    {
                        HashSet <string> urlNames = new HashSet <string>()
                        {
                            addonData.ProjectName,
                            addonData.ProjectName.Replace("-", ""),
                            addonData.ProjectName.Replace("_", ""),
                            addonData.ProjectName.Replace("_", "-"),
                            addonData.ProjectName.Replace("-", "_")
                        };
                        foreach (string folder in folders)
                        {
                            string lowered = folder.ToLower();

                            HashSet <string> folderNames = new HashSet <string>()
                            {
                                lowered,
                                lowered.Replace(" ", "-"),
                                lowered.Replace("_", "-")
                            };

                            if (folderNames.Contains(addonData.ProjectName))
                            {
                                found = true;
                                addonData.FolderName = folder;

                                break;
                            }

                            if (urlNames.Contains(lowered))
                            {
                                found = true;
                                addonData.FolderName = folder;

                                break;
                            }
                        }
                    }
                }

                addonData.SubFolders = folders.Where(f => !f.Equals(addonData.FolderName)).ToHashSet();

                if (found)
                {
                    File.Delete(zipFile);
                    Directory.Delete(zipFile.Replace(".zip", ""), true);
                }

                return(found, addonData);
            }
            catch (Exception e)
            {
                logger.LogError(e, "Someting went wrong for " + addonData.ProjectName);
                return(found, addonData);
            }
        }