private async void DLButton_Click(object sender, EventArgs e) { string[] userIDs = GetUserIDs().Except(new[] { "" }).ToArray(); // 読み込み対象のプレイヤーID bool[] checkStates = { cbNormal.Checked, cbAdvanced.Checked, cbTechnical.Checked, cbPandora.Checked }; bool isDownload(int dif) => checkStates[dif] || cbDetail.Checked || (dif >= 2 && cbTecpnd.Checked); // 各難易度を読み込むか List <int> musicListNATM = GetMusicLists(false), musicListPnd = GetMusicLists(true); //読み込む曲IDのリスト List <int> musicList(int dif) => dif == 3 ? musicListPnd : musicListNATM; //List<int> deletedList = new List<int>(); //サヨナラ曲の一覧 // データ格納用の配列 Player[] players = new Player[userIDs.Length]; Result[][][] results = new Result[userIDs.Length][][]; //[プレイヤー][難易度][曲(MusicDataの配列と同じ。若い順に0123...)] for (int i = 0; i < results.Length; ++i) { results[i] = new Result[4][]; for (int j = 0; j < results[i].Length; ++j) { results[i][j] = new Result[musicList(j).Count]; } } Multi[][] multis = new Multi[userIDs.Length][]; //[プレイヤー][曲(MusicDataの配列と同じ。)] for (int i = 0; i < multis.Length; ++i) { multis[i] = new Multi[musicListNATM.Count]; } StreamWriter writer; string doc; ControlEnable(false); // 左のバーの初期設定 progressBar.Value = 0; progressBar.Maximum = 0; if (cbPerson.Checked || cbDetail.Checked) { progressBar.Maximum = userIDs.Length; } for (int dif = 0; dif < 4; dif++) { if (isDownload(dif)) { progressBar.Maximum += userIDs.Length * musicList(dif).Count; } } if (cbMulti.Checked || cbDetail.Checked) { progressBar.Maximum += userIDs.Length * musicListNATM.Count; } if (progressBar.Maximum == 0) { progressBar.Maximum = 1; return; } statusLabel.Text = "Reading"; statusLabel.ForeColor = Color.Blue; //データの読み込み browser.BeginDocReadMode(browser.GetURL()); if (cbPerson.Checked || cbDetail.Checked) { for (int user = 0; user < userIDs.Length; user++) { doc = await browser.ReadDocument(LoungeURL.Player(userIDs[user])); players[user] = Player.ParseFromSite(doc, userIDs[user]); progressBar.Value++; } } for (int dif = 0; dif < 4; dif++) { if (isDownload(dif)) { for (int user = 0; user < userIDs.Length; user++) { for (int music = 0; music < musicList(dif).Count; music++) { try { int musicID = musicList(dif)[music]; //楽曲ID(musicとは違う) doc = await browser.ReadDocument(LoungeURL.Score(userIDs[user], musicID.ToString(), (Difficulty)dif)); Result result = Result.ParseFromSite(doc, musicID.ToString(), userIDs[user]); results[user][dif][music] = result; } catch (FileNotFoundException) { results[user][dif][music] = null; } progressBar.Value++; } } } } if (cbMulti.Checked || cbDetail.Checked) { for (int user = 0; user < userIDs.Length; user++) { for (int music = 0; music < musicListNATM.Count; music++) { try { int musicID = musicListNATM[music]; doc = await browser.ReadDocument(LoungeURL.Multi(userIDs[user], musicID.ToString())); Multi multi = Multi.ParseFromSite(doc, musicID.ToString(), userIDs[user], userPID); if (multi.Combo != "--") { multis[user][music] = multi; } else { multis[user][music] = null; } } catch (FileNotFoundException) { multis[user][music] = null; } progressBar.Value++; } } } browser.EndDocReadMode(); //データの書き出し UTF8Encoding encoding = new UTF8Encoding(true); string[] fname = { "Normal.csv", "Advanced.csv", "Technical.csv", "Pandora.csv" }; statusLabel.Text = "Writing"; if (cbPerson.Checked) { writer = new StreamWriter("Player.csv", false, encoding); writer.Write(Player.MakePlayerCSV(players)); writer.Close(); } if (cbDetail.Checked) { writer = new StreamWriter("Summary.csv", false, encoding); if (userIDs.Length == 1) { writer.Write(Summary.MakeCSV(new Summary(players[0], results[0], multis[0]))); } else { Summary[] s = new Summary[userIDs.Length]; for (int i = 0; i < userIDs.Length; i++) { s[i] = new Summary(players[i], results[i], multis[i]); } writer.Write(Summary.MakeCSV(s)); } writer.Close(); } for (int dif = 0; dif < 4; dif++) { if (checkStates[dif]) { writer = new StreamWriter(fname[dif], false, encoding); if (userIDs.Length == 1) { writer.Write(Result.MakeResultCSV(results[0][dif])); } else { Result[][] r = new Result[players.Length][]; for (int i = 0; i < players.Length; i++) { r[i] = results[i][dif]; } writer.Write(Result.MakeResultCSV(r, musicList(dif))); } writer.Close(); } } if (cbTecpnd.Checked) { Result[] tpRes = new Result[musicListNATM.Count]; int pndIndex; for (int i = 0; i < tpRes.Length; i++) { //まず箱があるか探す pndIndex = -1; string musicID = musicListNATM[i].ToString(); for (int j = 0; j < results[0][3].Length; j++) { if (results[0][3][j] != null && results[0][3][j].ID == musicID) { pndIndex = j; break; } } if (pndIndex != -1) { tpRes[i] = results[0][3][pndIndex]; } else { tpRes[i] = results[0][2][i]; } } writer = new StreamWriter("TP.csv", false, encoding); writer.Write(Result.MakeResultCSV(tpRes)); writer.Close(); } if (cbMulti.Checked) { writer = new StreamWriter("Multi.csv", false, encoding); if (userIDs.Length == 1) { writer.Write(Multi.MakeResultCSV(multis[0])); } else { writer.Write(Multi.MakeResultCSV(multis, musicListNATM)); } writer.Close(); } statusLabel.Text = "Success!"; statusLabel.ForeColor = Color.Green; ControlEnable(true); }