public static Multi ParseFromSite(string site, string songId, string pid, string ownpid) { Multi ret = new Multi(); string reg; string match; ret.PlayerID = pid; ret.SongID = songId; reg = "<div id = \"song_name\"> <p> 指定されたスコアは表示できません </p> </div>"; match = Parser.Match(site, reg); if (match != null) { throw new FileNotFoundException(); } reg = "<div id = \"song_name\"> <img src = \"/css/images/panel_wht_01.png\"> <div>([^<]+) </div> </div>"; match = Parser.Match(site, reg); ret.SongName = match ?? throw new FormatException("曲\'" + songId + "\'の曲名のパースに失敗しました"); reg = "<div class = \"td paramtitle\"> 全国ランキング </div> <div class = \"td data\"> ([^位]+)位 </div> </div>"; match = Parser.Match(site, reg); ret.Ranking = match ?? throw new FormatException("曲\'" + ret.SongName + "\'の順位のパースに失敗しました"); reg = "<div class = \"td paramtitle\"> ベストマルチコンボ </div> <div class = \"td data\"> ([^<]+) </div> </div>"; match = Parser.Match(site, reg); ret.Combo = match ?? throw new FormatException("曲\'" + ret.SongName + "\'のマルチコンボのパースに失敗しました"); if (ret.Combo == "--") { throw new FileNotFoundException(); } // パートナーは2人目なのでそこ以降を取り出す reg = "userplate_s_base[\\w\\W\\s]+userplate_s_base([\\w\\W\\s]+)"; match = Parser.Match(site, reg); site = match ?? throw new FormatException("曲\'" + ret.SongName + "\'のパートナーIDのパースに失敗しました"); reg = "onclick = \"JavaScript\\:toUserInfo\\(\'([^\']*)\'\\)"; ret.PartnerID = Parser.Match(site, reg); if (ret.PartnerID == null) { reg = "(ゲストの場合はアイコンも変更)"; if (Parser.Match(site, reg) == null) { ret.PartnerID = ownpid; } else { ret.PartnerID = ""; } } reg = "<div class = \"name\"> ([^<]*[^< ]) * <br>"; match = Parser.Match(site, reg); ret.PartnerName = match ?? throw new FormatException("曲\'" + ret.SongName + "\'のパートナー名のパースに失敗しました"); return(ret); }
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); }