public CollectDataUI(CardDataBase carddb) { InitializeComponent(); // BringToFront(); // Dock = DockStyle.Fill; Init(carddb); }
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 void Init(CardDataBase carddb) { int カード名別持ってるカード = carddb.getAllCardNumHave(); int カード名全カード = carddb.getAllCardNum(); int 略号別持ってるカード = carddb.getCardNumCodeHave(); int 略号別全カード = carddb.getCardNumCode(); int レアリティ別持ってるカード = carddb.getCardNumRarityHave(); int レアリティ別全カード = carddb.getCardNumRarity(); /* * foreach (var card in cardlist) * { * foreach (var variation in card.ListVariations) * { * foreach (var rarity in variation.ListRarity) * { * レアリティ別全カード++; * if (rarity.所持フラグ) * レアリティ別持ってるカード++; * } * 略号別全カード++; * if (variation.IsCardHavePack()) * 略号別持ってるカード++; * } * カード名全カード++; * if (card.IsCardHaveName()) * カード名別持ってるカード++; * * } */ label2.Text = カード名別持ってるカード.ToString(); label4.Text = カード名全カード.ToString(); label8.Text = 略号別持ってるカード.ToString(); label7.Text = 略号別全カード.ToString(); label13.Text = レアリティ別持ってるカード.ToString(); label12.Text = レアリティ別全カード.ToString(); if (カード名全カード > 0 && 略号別全カード > 0 && レアリティ別全カード > 0) { label5.Text = ((double)カード名別持ってるカード / カード名全カード).ToString("F") + "%"; label10.Text = ((double)略号別持ってるカード / 略号別全カード).ToString("F") + "%"; label15.Text = ((double)レアリティ別持ってるカード / レアリティ別全カード).ToString("F") + "%"; } else { label5.Text = "0%"; label10.Text = "0%"; label15.Text = "0%"; } }
//右側は左側で何をクリックしたかで変わる public static void SetFormPanelRight(TreeNode treenode, Form1 form) { if (treenode.Tag == null) { return; } form.splitContainer1.Panel2.Controls.Clear(); CardDataBase cardDB; PackData pack; if (form.あいうえお順ToolStripMenuItem.CheckState == CheckState.Indeterminate) { cardDB = ((TreeNodeAIUEOTag)treenode.Tag).CardDB; pack = null; } else { pack = (PackData)treenode.Tag; cardDB = new CardDataBase(); //全カードからそのパックにあるカードを探す foreach (var card in form.CardDB.CardList) { foreach (var variation in card.ListVariations) { if (variation.発売パック.Name == pack.Name) { cardDB.CardList.Add(card); break; } } } //順番はめちゃくちゃになってるので略号順にソート } CardListUI packUI = new CardListUI(cardDB, pack, form); form.splitContainer1.Panel2.Controls.Add(packUI); }
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); }
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); }
//Depthは読み取る文字数であり再帰回数 public async static Task RecursiveAddTreeNodeAIUEO(TreeNodeCollection treenodes, CardDataBase carddb, int Depth, string ParentName) { //あ~んなどまでの全部のNodeをここにも保存 List <TreeNode> AIUEONodeList = new List <TreeNode>(); //あ行~その他までのnodeを追加 foreach (var gyou in かな.行リスト) { var GyouNode = treenodes.Add($"{ParentName} 【{gyou.名前}】"); GyouNode.Tag = new TreeNodeAIUEOTag(gyou); //各行のひらがなをノードとして行ノードに追加 for (int i = 0; i < Program.getTextLength(gyou.文字); i++) { string one_text = Program.getTextElement(gyou.文字, i); var KanaNode = GyouNode.Nodes.Add(ParentName + one_text); KanaNode.Tag = new TreeNodeAIUEOTag(new 行(ParentName + one_text, one_text)); //1文字だけの行扱いだけど特に意味はない AIUEONodeList.Add(KanaNode); } } if (Depth == 0) { //最初だけ非表示ノードも追加 TreeNode node = treenodes.Add($"非表示"); node.Tag = new TreeNodeAIUEOTag(null); foreach (var card in carddb.CardList) { if (card.表示フラグ == false) { ((TreeNodeAIUEOTag)node.Tag).CardDB.CardList.Add(card); } } } //カードをツリーに登録する foreach (var card in carddb.CardList) { if (card.表示フラグ == false) { continue; } //文字数をオーバーしたらスキップ if (Program.getTextLength(card.読み) <= Depth) { continue; } //最初の文字を取得 string one_txt = Program.getTextElement(card.読み, Depth); foreach (var node in AIUEONodeList) { if (((TreeNodeAIUEOTag)(node.Tag)).Gyou.文字.Equals(one_txt)) { //行ノードとその下のかなノード両方登録 ((TreeNodeAIUEOTag)node.Tag).CardDB.CardList.Add(card); ((TreeNodeAIUEOTag)node.Parent.Tag).CardDB.CardList.Add(card); goto nextloop; } } //どこにも所属出来ない場合、その他に foreach (TreeNode node in treenodes) { if (node.Text.Contains("その他")) { ((TreeNodeAIUEOTag)node.Tag).CardDB.CardList.Add(card); break; } } nextloop :; } //要素がないツリーを削除 for (int i = treenodes.Count - 1; i >= 0; i--) { TreeNode node = treenodes[i]; for (int j = node.Nodes.Count - 1; j >= 0; j--) { TreeNode childnode = node.Nodes[j]; if (((TreeNodeAIUEOTag)childnode.Tag).CardDB.CardList.Count == 0) { node.Nodes.RemoveAt(j); } } if (((TreeNodeAIUEOTag)node.Tag).CardDB.CardList.Count == 0) { treenodes.RemoveAt(i); } } //カード枚数を表示 foreach (TreeNode node in treenodes) { var treenodetag = (TreeNodeAIUEOTag)node.Tag; int num = treenodetag.CardDB.CardList.Count; node.Text += $" ({num})"; foreach (TreeNode childnode in node.Nodes) { var childnodetag = (TreeNodeAIUEOTag)childnode.Tag; int childnum = childnodetag.CardDB.CardList.Count; childnode.Text += $" ({childnum})"; } } //再帰的にツリーを作成 for (int i = treenodes.Count - 1; i >= 0; i--) { TreeNode node = treenodes[i]; for (int j = node.Nodes.Count - 1; j >= 0; j--) { TreeNode childnode = node.Nodes[j]; var treenodetag = (TreeNodeAIUEOTag)childnode.Tag; if (treenodetag.Gyou.前 != "非表示" && treenodetag.CardDB.CardList.Count > 50) //50しかなかったらツリーを作成しない { await RecursiveAddTreeNodeAIUEO(childnode.Nodes, treenodetag.CardDB, Depth + 1, ((TreeNodeAIUEOTag)childnode.Tag).Gyou.前); //1つしか子を持っていない場合、自分を削除して親は孫を子にする NodeUp(childnode, node.Nodes); } } NodeUp(node, treenodes); } }