Example #1
0
        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);
        }
Example #2
0
        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);
        }