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); }
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); }
public CardVariation(PackData packdata, string code, List <Rarity> rarity) { 発売パック = packdata; 略号 = new Code(code); ListRarity = rarity; }