public void SetDeckChildren(string parenttokenType, string parentTokenIdx, List <LBD.GetComposableData> childrenTokens)
        {
            var deckInfo = new TcpMsg.DeckInfo();
            var tblDeck  = tblDecks.Find(x => x.tokenid == $"{parenttokenType}{parentTokenIdx}");

            if (null != tblDeck)
            {
                if (null == deckInfos)
                {
                    deckInfos = new List <TcpMsg.DeckInfo>();
                }

                deckInfo.name = tblDeck.deckname;
                var parentTokenInfo = nonFungibles.Find(x => x.tokenType == parenttokenType && x.tokenIdx == parentTokenIdx);
                deckInfo.heroCard = TokenInfoToCardInfo(parentTokenInfo);

                deckInfo.unitList = new List <TcpMsg.CardInfo>();
                foreach (var ctokenData in childrenTokens)
                {
                    var childrenTokenInfo = nonFungibles.Find(x => x.GetTokenId() == ctokenData.tokenId);
                    if (null != childrenTokenInfo)
                    {
                        deckInfo.unitList.Add(TokenInfoToCardInfo(childrenTokenInfo));
                    }
                }

                deckInfos.Add(deckInfo);
            }
            ComposableTokenReceive++;

            if (ComposableTokenRequest == ComposableTokenReceive)
            {
                // Load complete
                ComposableTokenRequest = 0;
                ComposableTokenReceive = 0;

                if (stateType == UserStateType.InitGetDeck)
                {
                    UserData();
                }
            }
        }
        public void RegisterDeck(string tokenId, string deckName)
        {
            var tokenInfo = nonFungibles.Find(x => x.GetTokenId() == tokenId);
            var ackData   = new TcpMsg.AckRegisterDeck();

            if (null == tokenInfo)
            {
                ackData.errCode = TcpMsg.Error.NotFoundTokenInfo;
            }
            else
            {
                var resourceCardData = TCGGameSrv.ResourceDataLoader.Data_Card_Dictionary_ID[Convert.ToInt32(tokenInfo.meta)];

                if (null == resourceCardData)
                {
                    ackData.errCode = TcpMsg.Error.ResourcdNotFound;
                }
                else
                {
                    if (resourceCardData.cardType != Resource.CardType.hero)
                    {
                        ackData.errCode = TcpMsg.Error.NotHeroCard;
                    }
                    else
                    {
                        if (null == deckInfos)
                        {
                            deckInfos = new List <TcpMsg.DeckInfo>();
                        }

                        var deck = deckInfos.Find(x => x.GetDeckUid() == tokenId);
                        if (null != deck)
                        {
                            ackData.errCode = TcpMsg.Error.Deck_Already_Exists;
                        }
                        else
                        {
                            var repoUser = TCGGameSrv.IocContainer.Resolve <Repository.IUser>();

                            var tblDeck = new Table.TblDeck()
                            {
                                tokenid  = tokenId,
                                deckname = deckName,
                                regDate  = DateTime.Now
                            };

                            tblDeck.seq = repoUser.InsertDeck(tblDeck);
                            tblDecks.Add(tblDeck);

                            deck = new TcpMsg.DeckInfo()
                            {
                                name     = deckName,
                                heroCard = TokenInfoToCardInfo(tokenInfo),
                                unitList = new List <TcpMsg.CardInfo>()
                            };

                            deckInfos.Add(deck);
                            ackData.deckInfo = deck;
                        }
                    }
                }
            }

            if (ackData.errCode != TcpMsg.Error.None)
            {
                logger.Warn($"UID={UID} Error Code={ackData.errCode.ToString()}");
            }

            Send(new Packet(ackData));
        }