示例#1
0
 public CardListUI(CardDataBase cardDB, PackData pack, Form1 form1)
 {
     InitializeComponent();
     Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
     Dock   = DockStyle.Fill;            //これやばいらしい?
     Init(cardDB, pack, form1);
 }
        public static async Task <List <PackData> > getAllPackDatasAsync(string URL, Form1 form)
        {
            Program.WriteLog("パックデータ取得中", LogLevel.必須項目);

            List <PackData> packDatas = new List <PackData>();

            var   task = Program.GetHtml(URL);  //taskはwait,resultしてはいけない awaitするべき
            await task;
            var   html = task.Result;


            //一般商品タブが要素0、特典・同梱系タブが要素2
            var DivNodes = html.QuerySelectorAll("div[class='card_list']");


            //リストタイトルとそのコンテンツ取得(基本ブースターパックなど)
            foreach (var node in DivNodes)
            {
                var PacSetNodes = node.QuerySelectorAll("div[class='pac_set']");
                foreach (var pacsetnode in PacSetNodes)
                {
                    var    ListTitleNode = pacsetnode.QuerySelector("div[class*='list_title open']>span");
                    string ListTitle     = ListTitleNode.TextContent;
                    Program.WriteLog(ListTitle, LogLevel.情報);

                    var PackNodes = pacsetnode.QuerySelectorAll("div[class='pack pack_ja']");
                    foreach (var packnode in PackNodes)
                    {
                        var namenode  = packnode.QuerySelector("p");
                        var rubynodes = namenode.QuerySelectorAll("rt");    //なんかルビが混ざるので除去
                        foreach (var n in rubynodes)
                        {
                            n.Remove();
                        }
                        string name = namenode.TextContent;

                        string 相対パス = packnode.QuerySelector("input").GetAttribute("value");

                        await Task.Delay(1000); //負荷軽減のため1秒待機;

                        (int num, DateTimeOffset day)tmp = await getPackData(Config.Domain + 相対パス);

                        if (tmp.num == -1)
                        {
                            MessageBox.Show("エラーが発生したため、パック収集を終了します。(ログ参照)", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return(null);
                        }

                        Program.WriteLog($"{name} : {Program.ToString(tmp.day)} : 全{tmp.num}枚 : {相対パス}", LogLevel.情報);
                        form.UpdateLabel($"{name} : {Program.ToString(tmp.day)} : 全{tmp.num}枚 : {相対パス}");
                        PackData pd = new PackData(Config.Domain + 相対パス, name, ListTitle, "", tmp.day, tmp.num);  //シリーズと誕生日はとりあえず空欄
                        packDatas.Add(pd);
                    }
                }
            }

            Program.WriteLog("パックデータ取得終了", LogLevel.必須項目);

            return(packDatas);
        }
示例#3
0
        public static async Task <CardDataBase> getAllCardsAsync(Config config, Form1 form, List <string> errorlist)
        {
            Program.WriteLog("カードデータ取得中", LogLevel.必須項目);

            CardDataBase carddatabase = new CardDataBase();
            int          NoCardCount  = 0;

            for (int i = (int)config.CardID_MIN; i < config.CardID_MAX + 1; i++)
            {
                await Task.Delay(1000); //負荷軽減のため1秒待機;

                //カードリストはjavascriptを経由しないと入手できないっぽいので直接idを入力(当てずっぽう)
                string url  = config.URL2 + i;
                var    html = await Program.GetHtml(url);

                if (html == null)
                {
                    errorlist.Add(" id=" + i + " ");
                    Program.WriteLog($"エラー発生。ログファイル参照。[{url}]", LogLevel.エラー);

                    if (errorlist.Count > 10)
                    {
                        Program.WriteLog($"エラーが多すぎるので強制終了", LogLevel.エラー);
                        MessageBox.Show("エラーが多すぎたため、カード収集を終了します。(ログ参照)", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return(null);
                    }

                    continue;
                }

                if (html.Source.Text.IndexOf("カード情報がありません。") >= 0)
                {
                    Program.WriteLog(config.URL2 + i + ":カードデータなし", LogLevel.情報);
                    NoCardCount++;
                    if (config.Is捜索打ち切り == true && NoCardCount >= config.捜索打ち切り限界)
                    {
                        Program.WriteLog($"カード情報が{NoCardCount}回連続で存在しなかったので捜索終了", LogLevel.必須項目);
                        break;
                    }
                    continue;
                }

                var    DivNameNode   = html.QuerySelector("div[id='cardname']>h1");
                var    ListSpanNodes = DivNameNode.QuerySelectorAll("span");
                string 読み            = "";
                string 英語            = ""; //英語名が存在しないカードがある

                for (int j = 0; j < ListSpanNodes.Count(); j++)
                {
                    if (j == 0)
                    {
                        読み = ListSpanNodes[0].TextContent;
                    }
                    if (j == 1)
                    {
                        英語 = ListSpanNodes[1].TextContent;
                    }
                }


                //タグがないので面倒だが、正規表現を使って1回だけ置き換える(全部置き換えるとカタカナの名前は全部なくなってしまう)
                var    re1  = new Regex(読み);
                var    re2  = new Regex(Regex.Escape(英語)); //カッコなどのメタ文字があるのでエスケープを追加する
                string str1 = re1.Replace(DivNameNode.TextContent, "", 1);
                string str2 = re2.Replace(str1, "", 1);
                string 前    = str2.Trim();

                var CardTextSetNode = html.QuerySelector("div[id='CardTextSet']");
                var ItemBoxNodes    = CardTextSetNode.QuerySelectorAll("div[class*='item_box']");

                Dictionary <string, string> dic = new Dictionary <string, string>();
                string 種族 = "";
                foreach (var node in ItemBoxNodes)
                {
                    //種族欄のとき
                    var speciesnode = node.QuerySelector("p[class='species']");
                    if (speciesnode != null)
                    {
                        種族 = speciesnode.TextContent.Replace("\t", "").Replace("\n", "");
                        continue;
                    }
                    //その他の欄のとき
                    var titlenode = node.QuerySelector("span[class='item_box_title']");
                    var valuenode = node.QuerySelector("span[class='item_box_value']");
                    if (titlenode != null && valuenode != null)  //ペンデュラムだと中身がないことがある
                    {
                        dic.Add(titlenode.TextContent.Trim(), valuenode.TextContent.Trim());
                    }
                }

                //ペンデュラムテキスト
                var pendulumnode1 = CardTextSetNode.QuerySelector("div[class='CardText pen']");
                var pendulumnode2 = pendulumnode1.QuerySelector("div[class='item_box_text']");

                //カードテキスト
                var    cardtextnode = CardTextSetNode.QuerySelector("div[class='CardText']>div[class='item_box_text']");
                string cardtext     = cardtextnode.TextContent.Replace("カードテキスト", "").Trim();//タグないので面倒


                //カード情報を取得したので、次は収録シリーズを取得

                List <CardData.CardVariation> listvaridations = new List <CardData.CardVariation>();

                var SeriesNode  = html.QuerySelector("div[id='update_list']");
                var SeriesNodes = SeriesNode.QuerySelectorAll("div[class='t_row']");

                foreach (var node in SeriesNodes)
                {
                    var    誕生日node  = node.QuerySelector("div[class='time']");
                    string 誕生日      = Program.getTextContent(誕生日node);
                    var    略号node   = node.QuerySelector("div[class='card_number']");
                    string 略号       = Program.getTextContent(略号node);
                    var    パック名node = node.QuerySelector("div[class='pack_name flex_1']");
                    string パック名     = Program.getTextContent(パック名node);
                    var    URLnode  = node.QuerySelector("input[class='link_value']");
                    string URL      = Config.Domain + URLnode.GetAttribute("value");
                    var    Rarenode = node.QuerySelector("div[class*='lr_icon']");
                    string レア記号     = Program.getTextContent(Rarenode.QuerySelector("p"));
                    string レアリティ    = Program.getTextContent(Rarenode.QuerySelector("span"));

                    //これは仮のパックデータ 本物はパック情報を開くときに特定する
                    PackData packdata = new PackData(URL, パック名, "", "", Program.ConvertDate(誕生日, "yyyy-MM-dd"), 0);


                    CardData.Rarity rarity = new CardData.Rarity(レア記号, レアリティ);

                    //リストと比較して同じならレアリティ違いに統合
                    foreach (var vari in listvaridations)
                    {
                        if (packdata.Name == vari.発売パック.Name)
                        {
                            vari.ListRarity.Add(rarity);
                            goto nextloop;
                        }
                    }

                    //なかったら追加
                    List <CardData.Rarity> listrarity = new List <CardData.Rarity>();
                    listrarity.Add(rarity);

                    CardData.CardVariation variation = new CardData.CardVariation(packdata, 略号, listrarity);
                    listvaridations.Add(variation);

                    nextloop :;
                }

                //varidationのpackdataが、既に存在するpackdataListと矛盾していないかチェック・・・する必要ある?するならここ


                読み = Kanaxs.Kana.ToKatakana(読み); //ひらがなはカタカナにする
                読み = RemoveSymbol(読み);           //読みに紛れ込む記号などを排除

                CardData carddata = new CardData(i, url, 前, 読み, 英語, dic, Program.getTextContent(pendulumnode2), cardtext, 種族, listvaridations);

                Program.WriteLog(carddata.前 + " : " + carddata.読み + " : " + carddata.英語名 + " : " + config.URL2 + i, LogLevel.情報);
                Program.WriteLog(Program.ToJson(carddata.ValuePairs, Newtonsoft.Json.Formatting.None) + " : " + carddata.テキスト + " : " + carddata.ペンデュラム効果, LogLevel.情報);
                Program.WriteLog(Program.ToJson(listvaridations, Newtonsoft.Json.Formatting.None), LogLevel.情報);
                form.UpdateLabel((i - config.CardID_MIN) + "/" + (config.CardID_MAX + 1 - config.CardID_MIN) + ":" + carddata.前);

                carddatabase.CardList.Add(carddata);
                NoCardCount = 0;
            }
            Program.WriteLog("カードデータ取得終了", LogLevel.必須項目);


            return(carddatabase);
        }
示例#4
0
        public void Init(CardDataBase cardDB, PackData pack, Form1 form1)
        {
            form   = form1;
            CardDB = cardDB;
            if (form.あいうえお順ToolStripMenuItem.CheckState == CheckState.Indeterminate)
            {
                Pack = null;
                linkLabel1.Visible = false;
                label1.Visible     = false;
                label4.Visible     = false;

                PackCardDB = cardDB;
            }
            else if (form.パック順ToolStripMenuItem.CheckState == CheckState.Indeterminate)
            {
                Pack            = pack;
                linkLabel1.Text = Pack.Name;
                label1.Text     = Pack.TypeName;
                label4.Text     = Pack.SeriesName;

                PackCardDB.CardList.Clear();

                //variationがそのパックのカードで、そのvariationのみの状態のカードを新しく作成し、それ用のリストに追加
                foreach (var card in cardDB.CardList)
                {
                    foreach (var variation in card.ListVariations)
                    {
                        if (variation.発売パック.URL == pack.URL)
                        {
                            var tmpcard = new CardData(card, variation);
                            PackCardDB.CardList.Add(tmpcard);
                            break;
                        }
                    }
                }
            }
            collectDataUI1.Init(PackCardDB);                //埋め込むのに引数のないコンストラクタが必要なので初期化


            Color red    = Color.FromArgb(255, 128, 128);
            Color yellow = Color.FromArgb(255, 255, 128);
            Color green  = Color.FromArgb(128, 255, 128);

            dataGridView1.Rows.Clear();
            foreach (var card in PackCardDB.CardList)
            {
                string ryakugou = "";
                string rarity   = "";

                if (card.getCardNumRarity() == 1)                   //1枚しか存在しない場合はクイックチェックが可能に
                {
                    ryakugou = card.ListVariations[0].略号.get略号Full();
                    rarity   = card.ListVariations[0].ListRarity[0].Initial;
                }
                else
                {
                    ryakugou = $"{card.getCardNumCodeHave()} / {card.getCardNumCode()}";
                    rarity   = $"{card.getCardNumRarityHave()} / {card.getCardNumRarity()}";
                }

                int num = dataGridView1.Rows.Add(card.IsCardNameHave(), card.前, ryakugou, rarity, card.ListVariations[0].ListRarity[0].所持フラグ);
                dataGridView1.Rows[num].Tag = CardDB.getCard(card.ID);                 //行のタグにカード情報を埋め込む  cardは変更されてる可能性があるのでCardDBから同じのを持ってくる
                dataGridView1.Rows[num].Cells["名前"].Style.BackColor = card.IsCardNameHave() ? green : red;
                Color c;
                if (card.getCardNumCodeHave() == 0)
                {
                    c = red;
                }
                else if (card.getCardNumCodeHave() == card.getCardNumCode())
                {
                    c = green;
                }
                else
                {
                    c = yellow;
                }

                dataGridView1.Rows[num].Cells["略号"].Style.BackColor = c;

                if (card.getCardNumRarityHave() == 0)
                {
                    c = red;
                }
                else if (card.getCardNumRarityHave() == card.getCardNumRarity())
                {
                    c = green;
                }
                else
                {
                    c = yellow;
                }

                dataGridView1.Rows[num].Cells["レアリティ"].Style.BackColor = c;

                var dgvcell = (DataGridViewImageCell)dataGridView1.Rows[num].Cells["type"];
                dgvcell.Value = getCanvasCardColor(card, dgvcell);

                var quickcell = dataGridView1.Rows[num].Cells["クイック"];

                if (card.getCardNumRarity() == 1)                    //1枚しか存在しない場合はクイックチェックが可能に
                {
                    quickcell.Tag             = card.ListVariations[0].ListRarity[0];
                    quickcell.Style.BackColor = c;
                }
                else
                {
                    dataGridView1.Rows[num].Cells["クイック"].Value    = null;
                    dataGridView1.Rows[num].Cells["クイック"]          = new DataGridViewTextBoxCell();             //テキストボックスを消すためにタイプを変更
                    dataGridView1.Rows[num].Cells["クイック"].Value    = "";
                    dataGridView1.Rows[num].Cells["クイック"].ReadOnly = true;
                }
            }

            //DGVの内容物に合わせてサイズを大きくする
            dataGridView1.Size = new Size(dataGridView1.Size.Width, dataGridView1.ColumnHeadersHeight + CardDB.CardList.Count * dataGridView1.RowTemplate.Height);
        }
 public CardVariation(PackData packdata, string code, List <Rarity> rarity)
 {
     発売パック      = packdata;
     略号         = new Code(code);
     ListRarity = rarity;
 }