示例#1
0
        public void DecksEdited_NewDeck()
        {
            List <Hearthstone.Deck> decks   = null;
            List <Hearthstone.Deck> added   = null;
            List <Hearthstone.Deck> removed = null;
            List <Hearthstone.Deck> edited  = null;

            LoadDecks();
            Assert.AreEqual(2, _collection.Decks.Count());
            _collection.DecksChanged += args =>
            {
                decks   = args.Items.ToList();
                added   = args.Added.ToList();
                removed = args.Removed.ToList();
                edited  = args.Edited.ToList();
            };
            var deck = DeckSerializer.Deserialize("AAECAZ8FBvQF2a4CucECg8cCteYCt+cCDKcF9QXZB7EIu68C/68CuMcC2ccC48sC+NIC1uUCieYCAA==");

            deck.DeckId = 3;
            deck.Name   = "new deck";
            _collection.OnDeckEdited(new DeckEditedEventArgs(deck));
            Assert.IsNotNull(decks);
            Assert.AreEqual(3, decks.Count);
            Assert.AreEqual(deck.Name, decks.Single(x => x.DeckId == 3).Name);
            Assert.IsNotNull(added);
            Assert.AreEqual(1, added.Count);
            Assert.AreEqual(deck.Name, added.Single().Name);
            Assert.IsNotNull(removed);
            Assert.AreEqual(0, removed.Count);
            Assert.IsNotNull(edited);
            Assert.AreEqual(0, edited.Count);
        }
示例#2
0
        public static void LoadPlayerCreatedDecksFromFile()
        {
            string        path        = Path.Combine(Config.SavedDataFolder(), Config.SavedDecksFile());
            List <string> lines       = File.ReadAllLines(path).ToList();
            List <string> decksToLoad = new List <string>();
            string        input       = "";

            for (int i = 0; i < lines.Count; i++)
            {
                input = input + lines[i] + "\n";
                if (lines.Count == i + 1)
                {
                    decksToLoad.Add(input);
                    input = "";
                }
                else
                {
                    if (lines[i + 1].StartsWith("###"))
                    {
                        decksToLoad.Add(input);
                        input = "";
                    }
                }
            }
            decksToLoad.ForEach(x => CurrentDecks.Add(DeckSerializer.Deserialize(x)));

            Log.Info("Successfully loaded player created decks from file.");
        }
示例#3
0
        public void TestReserialize()
        {
            var deck         = DeckSerializer.Deserialize(DeckString);
            var reserialized = DeckSerializer.Serialize(deck, false);

            Assert.AreEqual(DeckString, reserialized);
        }
示例#4
0
        public void CardIdCollisionDeck_ValidShortId()
        {
            var hearthDbDeck = DeckSerializer.Deserialize("AAEBAf0EHnGeAcABwwG7Au4CqwSWBewF9w2JDroWwxbXtgLrugLYuwLZuwKHvQLBwQKP0wKi0wLu9gKnggP1iQP8owOSpAO+pAO/pAPdqQP0qwMAAA==");
            var deck         = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
            var shortid      = ShortIdHelper.GetShortId(deck);

            Assert.AreEqual(shortid, "mA9O7wXvzxMsx1KO7EuFve");
        }
示例#5
0
        public void HighlanderHunter_ValidShortId()
        {
            var hearthDbDeck = DeckSerializer.Deserialize("AAECAR8engGoArUDxwOHBMkErgbFCNsJ7Qn+DJjwAp7wAu/xAqCAA6eCA5uFA/WJA+aWA/mWA76YA7acA56dA/yjA+WkA5+lA6KlA6alA4SnA5+3AwAA");
            var deck         = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
            var shortid      = ShortIdHelper.GetShortId(deck);

            Assert.AreEqual(shortid, "O2VpFDQokIrwww8iOmE3Lc");
        }
示例#6
0
        public void ComboPriest_ValidShortId()
        {
            var hearthDbDeck = DeckSerializer.Deserialize("AAECAa0GBqUJ+wzl9wLQ/gKnhwOppQMM+ALlBPYH1QjRCtIK8gz3DK+lA9KlA/2nA4SoAwA=");
            var deck         = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
            var shortid      = ShortIdHelper.GetShortId(deck);

            Assert.AreEqual(shortid, "0gsPp02q8ajKsGVstRwLpb");
        }
示例#7
0
        public void BasicMageDeck_ValidShortId()
        {
            var hearthDbDeck = DeckSerializer.Deserialize("AAECAf0EAA9NWtgBtAK7AosDqwS0BOAE+wSWBYoH7AeeCZYNAA==");
            var deck         = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
            var shortid      = ShortIdHelper.GetShortId(deck);

            Assert.AreEqual(shortid, "KtYDbAkM8IjSSyLMWQn5zb");
        }
示例#8
0
        public void GetDeckstring()
        {
            const string deckstring = "AAEBAYDTAgSyAq8EkbwCnOICDbQB7QKoBdQF3QiStgKBwgLrwgKbywLKywKmzgL70wLb4wIA";
            var          hdbDeck    = DeckSerializer.Deserialize(deckstring);
            var          deck       = new Hearthstone.Deck(DeckType.Constructed, hdbDeck);

            Assert.AreEqual(deckstring, deck.GetDeckstring());
        }
示例#9
0
        public void Parse(Line line)
        {
            const string findingGameWithHero = "Finding Game With Hero: ";

            if (line.Text == "Deck Contents Received:")
            {
                _state = State.ReceivingDecks;
                InvokeFoundDecksAsync();
            }
            else if (line.Text == "Finished Editing Deck:")
            {
                UpdateState(State.FinishedEditingDeck);
            }
            else if (_findingGame.Contains(line.Text))
            {
                UpdateState(State.FindingGameWithDeck);
            }
            else if (line.Text.StartsWith(findingGameWithHero))
            {
                UpdateState(State.FindingGameWithHero);
                if (int.TryParse(line.Text.Substring(findingGameWithHero.Length), out var dbfId))
                {
                    FindingGame?.Invoke(new QueuedForGameEventArgs(dbfId));
                }
            }
            else
            {
                if (_currentDeck.Count > 0 || line.Text.StartsWith("#"))
                {
                    _currentDeck.Add(line.Text);
                }
                if (_currentDeck.Count == 3)
                {
                    try
                    {
                        var deck = DeckSerializer.Deserialize(string.Join("\n", _currentDeck));
                        if (_state == State.FindingGameWithDeck)
                        {
                            FindingGame?.Invoke(new QueuedForGameEventArgs(deck));
                        }
                        else if (_state == State.FinishedEditingDeck)
                        {
                            EditedDeck?.Invoke(new DeckEditedEventArgs(deck));
                        }
                        else
                        {
                            _current.Add(deck);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error(e);
                    }
                    _currentDeck.Clear();
                }
            }
        }
示例#10
0
        public static void SavePlayerCreatedDecksToFile()
        {
            List <string> deckStrings = CurrentDecks.Select(x => DeckSerializer.Serialize(x, true)).ToList();
            string        path        = Path.Combine(Config.SavedDataFolder(), Config.SavedDecksFile());

            File.WriteAllLines(path, deckStrings);

            Log.Info("Successfully saved player created decks to file.");
        }
示例#11
0
        public static async Task <Deck> TryFindDeck(string url)
        {
            try
            {
                var doc = await ImportingHelper.GetHtmlDoc(url);

                var deck      = new Deck();
                var metaNodes = doc.DocumentNode.SelectNodes("//meta");
                if (!metaNodes.Any())
                {
                    return(null);
                }
                deck.Name = GetMetaProperty(metaNodes, "x-hearthstone:deck");
                deck.Url  = GetMetaProperty(metaNodes, "x-hearthstone:deck:url") ?? url;

                var deckString = GetMetaProperty(metaNodes, "x-hearthstone:deck:deckstring");
                if (!string.IsNullOrEmpty(deckString))
                {
                    try
                    {
                        var hearthDbDeck   = DeckSerializer.Deserialize(deckString);
                        var fromDeckString = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
                        fromDeckString.Name = deck.Name;
                        fromDeckString.Url  = deck.Url;
                        return(fromDeckString);
                    }
                    catch (Exception e)
                    {
                        Log.Error(e);
                    }
                }

                var heroId = GetMetaProperty(metaNodes, "x-hearthstone:deck:hero");
                if (!string.IsNullOrEmpty(heroId))
                {
                    deck.Class = Hearthstone.Database.GetCardFromId(heroId).PlayerClass;
                }
                var cardList = GetMetaProperty(metaNodes, "x-hearthstone:deck:cards").Split(',');
                foreach (var idGroup in cardList.GroupBy(x => x))
                {
                    var card = Hearthstone.Database.GetCardFromId(idGroup.Key);
                    card.Count = idGroup.Count();
                    deck.Cards.Add(card);
                    if (deck.Class == null && card.IsClassCard)
                    {
                        deck.Class = card.PlayerClass;
                    }
                }
                return(deck);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return(null);
            }
        }
示例#12
0
        public void DeserializeWithComments()
        {
            var deck = DeckSerializer.Deserialize(FullDeckString);

            Assert.AreEqual("Warrior123", deck.Name);
            Assert.AreEqual(30, deck.GetCards().Values.Sum());
            var serialized = DeckSerializer.Serialize(deck, false);

            Assert.AreEqual(DeckString, serialized);
        }
示例#13
0
        public void TestSerializerCommentsDefaults()
        {
            var deck = DeckSerializer.Deserialize(DeckString);

            var commented = DeckSerializer.Serialize(deck, true);
            var lines     = commented.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            Assert.AreEqual("### Warrior Deck", lines[0]);
            Assert.AreEqual("# Class: Warrior", lines[1]);
            Assert.AreEqual("# Format: Standard", lines[2]);
        }
示例#14
0
        public void TestDeckStrings()
        {
            var deck = DeckSerializer.Deserialize(DeckString);

            Assert.AreEqual(CardIds.Collectible.Warrior.GarroshHellscreamHeroHeroSkins, deck.GetHero().Id);
            var cards = deck.GetCards();

            Assert.AreEqual(30, cards.Values.Sum());
            var heroicStroke = cards.FirstOrDefault(c => c.Key.Id == CardIds.Collectible.Warrior.HeroicStrike);

            Assert.IsNotNull(heroicStroke);
            Assert.AreEqual(2, heroicStroke.Value);
        }
示例#15
0
        private void LoadDecks()
        {
            var deck1 = DeckSerializer.Deserialize("AAECAZ8FBvQFucECg8cC1uUCteYCt+cCDKcF9QXZB7EI2a4Cu68C/68CuMcC2ccC48sC+NICieYCAA==");

            deck1.DeckId = 1;
            var deck2 = DeckSerializer.Deserialize("AAECAf0GBOCsApfTAp3iAtvpAg2KAZME9wS2B+EH3sQC58sC8tAC+NACiNICi+EC/OUC6OcCAA==");

            deck2.DeckId = 2;
            _collection.OnDecksLoaded(new ConstructedDeckFoundEventArgs(new List <Deck>
            {
                deck1,
                deck2
            }));
        }
示例#16
0
        public void TestDeckStringsClassic()
        {
            var deck = DeckSerializer.Deserialize(ClassicDeckstring);

            Assert.AreEqual(CardIds.Collectible.Druid.MalfurionStormrage_EliseStarseekerHeroHeroSkins, deck.GetHero().Id);
            var cards = deck.GetCards();

            Assert.AreEqual(30, cards.Values.Sum());
            var claw = cards.FirstOrDefault(c => c.Key.Id == CardIds.Collectible.Druid.ClawVanilla);

            Assert.IsNotNull(claw);
            Assert.AreEqual(1, claw.Value);
            Assert.AreEqual(FormatType.FT_CLASSIC, deck.Format);
        }
示例#17
0
        public static async Task <Deck> Import(bool rethrow = false)
        {
            Exception error = null;

            try
            {
                var clipboard = Clipboard.GetText();
                var validUrl  = Uri.TryCreate(clipboard, UriKind.Absolute, out Uri uriResult) &&
                                (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
                if (validUrl)
                {
                    return(await DeckImporter.Import(clipboard));
                }

                try
                {
                    var hearthDbDeck = DeckSerializer.Deserialize(clipboard);
                    var deck         = HearthDbConverter.FromHearthDbDeck(hearthDbDeck);
                    if (deck != null)
                    {
                        return(deck);
                    }
                }
                catch (Exception e)
                {
                    error = e;
                    Log.Error(e);
                    if (rethrow)
                    {
                        throw error;
                    }
                }

                if (StringImporter.IsValidImportString(clipboard))
                {
                    return(StringImporter.Import(clipboard));
                }
                return(JsonDeckImporter.Import(clipboard));
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                if (rethrow)
                {
                    throw error ?? ex;
                }
                return(null);
            }
        }
示例#18
0
        public void TestSerializerComments()
        {
            var deck = DeckSerializer.Deserialize(DeckString);

            deck.Name       = "Warrior123";
            deck.ZodiacYear = ZodiacYear.MAMMOTH;

            var commented = DeckSerializer.Serialize(deck, true);
            var lines     = commented.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            Assert.AreEqual("### Warrior123", lines[0]);
            Assert.AreEqual("# Class: Warrior", lines[1]);
            Assert.AreEqual("# Format: Standard", lines[2]);
            Assert.AreEqual("# Year of the Mammoth", lines[3]);
        }
示例#19
0
        /// <summary>
        /// Generates a deckcode for the deck that was last played during the game
        /// </summary>
        /// <returns></returns>
        public string GenerateDeckCode()
        {
            // Extract deckcode
            string deckcode;

            try
            {
                deckcode = DeckSerializer.Serialize(this, false);
            }
            catch (Exception exc)
            {
                Log.Error(exc);
                throw new Exception("Exception while serializing played deck");
            }

            // And return it
            Hearthstone_Deck_Tracker.Utility.Logging.Log.Info(deckcode);
            return(deckcode);
        }
示例#20
0
        private void LoadDeckSerializer()
        {
            const int totalSteps = 4;

            ResetProgressBar(totalSteps);

            // Set messages
            mLoadResults.Text = "Loading...";
            mInfoGrid.Rows.Clear();
            IncrementBar();

            // Attempt to download sheet into our temp location
            // If download fails, default to LKG
            string fileToUse;

            try
            {
                using (var client = new WebClient())
                {
                    client.DownloadFile(kGoogleSheetSourceURL, kTempBookFileName);
                }
                fileToUse = kTempBookFileName;
            }
            catch (Exception)
            {
                fileToUse = kLKGBookFileName;
            }
            IncrementBar();

            // We can't do anything if we both failed to download and had no available Last Known Good
            if (!File.Exists(fileToUse))
            {
                mLoadResults.Text = "Failed download with no available LKG";
                return;
            }

            // Load serializer, this will throw on fail
            mDeckSerializer = new DeckSerializer(fileToUse, "みんなの日本語");
            mDeckSerializer.LoadDecks();
            IncrementBar();

            // Report invalid decks
            List <Deck> invalidDecks  = mDeckSerializer.GetInvalidDecks();
            bool        hasErrors     = false;
            bool        hasEmptyDecks = false;

            if (invalidDecks.Count > 0)
            {
                foreach (Deck deck in invalidDecks)
                {
                    List <string> errors = deck.GetErrors();
                    if (errors.Count > 0)
                    {
                        hasErrors = true;
                        foreach (string error in errors)
                        {
                            AddToInfoGrid(deck, error, true);
                        }
                    }
                    else if (deck.GetCardCount() == 0)
                    {
                        hasEmptyDecks = true;
                        AddToInfoGrid(deck, "Empty deck");
                    }
                    else
                    {
                        hasErrors = true;
                        AddToInfoGrid(deck, "Marked as invalid, but unable to identify why", true);
                    }
                }
            }

            if (hasErrors)
            {
                mLoadResults.Text = "Errors present; fully valid decks still loaded.";
            }
            else
            {
                mLoadResults.Text = (hasEmptyDecks ? "Success, but with empty decks" : "Success!");

                // Serializer loaded successfully (we didn't throw an exception during it)
                // If we used a file other than LKG, swap
                if (fileToUse != kLKGBookFileName)
                {
                    if (File.Exists(kLKGBookFileName))
                    {
                        File.Delete(kLKGBookFileName);
                    }
                    File.Move(fileToUse, kLKGBookFileName);
                }
            }
            IncrementBar();

            // Update our interface with the new values
            mBookAndChapterNumbers = mDeckSerializer.GetBookAndChapterNumbers();
            mTrackBarMin.Maximum   = mBookAndChapterNumbers.Count - 1;
            mTrackBarMax.Maximum   = mTrackBarMin.Maximum;
            mTrackBarMax.Value     = mTrackBarMin.Maximum;
            UpdateAggregateDisplay();
        }