/// <summary> /// Responds when the background worker is activated /// </summary> /// <param name="sender">Object calling this function</param> /// <param name="e">Event arguments</param> private void backgroundWorkerBruteForce_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; // Get HTML from Liquipedia backgroundWorkerBruteForce.ReportProgress(0, "Retrieving Liquipedia page"); WebFetch page = new WebFetch(textBoxURL.Text + "&action=edit", errorwriter); if (page.pageContent != string.Empty) { page.ReduceToWikiMarkup(); if (page.pageContent.IndexOf("#REDIRECT") != -1) { int start = page.pageContent.IndexOf("[[") + 2; int end = page.pageContent.IndexOf("]]"); page = new WebFetch(WIKIBASE + page.pageContent.Substring(start, end - start) + "&action=edit", errorwriter); page.ReduceToWikiMarkup(); } // Limit the number of weeks we consider int maxWeeks; bool result = int.TryParse(textBoxWeeks.Text, out maxWeeks); if (!result) { maxWeeks = 0; } // Read in data from the webpage backgroundWorkerBruteForce.ReportProgress(0, "Parsing webpage"); statistics.ParseMarkup(page.pageContent, maxWeeks); // Print all the data we've retrieved statistics.PrintPlayerStats(); statistics.PrintPlayerTrVal(); statistics.PrintTeamStats(); statistics.PrintPlayerTrVal(); // Limit the number of players we consider int maxPlayers; result = int.TryParse(textBoxNumPlayers.Text, out maxPlayers); if (!result) { maxPlayers = 0; } // Brute force the solution backgroundWorkerBruteForce.ReportProgress(0, "Brute forcing solution"); statistics.BruteForceMainNoTrades(maxPlayers); backgroundWorkerBruteForce.ReportProgress(0, "Solution complete"); } else { backgroundWorkerBruteForce.ReportProgress(0, "Couldn't retrieve Liquipedia page"); } }
public Stats(ErrorWriter ewriter, double inputPointModifier) { errorwriter = ewriter; int index = 0; int tempindex = 0; int tableEnd = 0; pointModifier = inputPointModifier; // Initialize AlternateNames altSearcher = new AlternateNames(errorwriter); // Read Do Not Draft list try { StreamReader reader = new StreamReader(".//DoNotDraft.txt"); do { string temp = reader.ReadLine(); doNotDraftList.Add(temp.ToUpper()); } while (!reader.EndOfStream); } catch (FileNotFoundException e) { errorwriter.Write("Could not find DoNotDraft.txt ( " + e.Message + ")"); } catch (Exception e) { errorwriter.Write("Error making the do not draft list ( " + e.Message + ")"); } // Read source for player and team lists WebFetch fetch = new WebFetch(FPLSTATS, errorwriter); string source = fetch.pageContent; // Locate start of team table int tableStart = source.IndexOf("<table class='highlight'>"); index = tableStart; // Locate end of team table tableEnd = source.IndexOf("</table>", index); // Get # of columns between team and cost index = source.IndexOf("Team", index) + 1; int costRows = 0; do { index = source.IndexOf("<th", index); index = source.IndexOf("<a", index); tempindex = source.IndexOf(">", index) + 1; costRows++; } while (source.Substring(tempindex, 1) != "$"); // Get info for all teams index = source.IndexOf("http://www.teamliquid.net/tlpd/sc2-korean", index); do { try { // Get team name tempindex = source.IndexOf(">", index) + 1; index = source.IndexOf("<", tempindex); string name = source.Substring(tempindex, index - tempindex); // Skip to cost column for (int i = 0; i < costRows - 1; i++) { index = source.IndexOf("<td", index) + 3; } // Read team cost tempindex = source.IndexOf("<td", index) + 3; tempindex = source.IndexOf(">", tempindex) + 1; index = source.IndexOf("<", tempindex); int cost = Convert.ToInt32(source.Substring(tempindex, index - tempindex)); teamList.Add(name.ToUpper(), new Team(name, cost, ARRAYSIZE, TOTALGAMES, pointModifier)); } catch (Exception e) { errorwriter.Write("Error reading team list (" + e.Message + ")"); } finally { index = source.IndexOf("http://www.teamliquid.net/tlpd/sc2-korean", index); } } while (index < tableEnd && index != -1); // Output log entry errorwriter.Write("Info for " + teamList.Count + " teams read"); // Locate start of player table index = source.IndexOf("<table class='highlight'>", tableEnd); // Locate end of player table tableEnd = source.IndexOf("</table>", index); // Locate # of columns from team to cost stat index = source.IndexOf("Team", index); costRows = 0; do { index = source.IndexOf("<th", index) + 3; costRows++; } while (index < source.IndexOf("Cost", tableStart) && index != -1 + 3); costRows--; // Get info for all players index = source.IndexOf("<img src='/tlpd/images/", index); do { try { // Get race index += "<img src='/tlpd/images/".Length; string race = source.Substring(index, 1).ToUpper(); // Get name index = source.IndexOf("http://www.teamliquid.net/tlpd/sc2-korean", index); tempindex = source.IndexOf(">", index) + 1; index = source.IndexOf("<", tempindex); string name = source.Substring(tempindex, index - tempindex); // Get team index = source.IndexOf("http://www.teamliquid.net/tlpd/sc2-korean", index); tempindex = source.IndexOf(">", index) + 1; index = source.IndexOf("<", tempindex); string team = FullTeamName(source.Substring(tempindex, index - tempindex)); // Skip columns to reach cost column for (int i = 0; i < costRows - 1; i++) { index = source.IndexOf("<td", index) + 3; } // Read player cost tempindex = source.IndexOf("<td", index) + 4; tempindex = source.IndexOf(">", tempindex) + 1; index = source.IndexOf("<", tempindex); int cost = Convert.ToInt32(source.Substring(tempindex, index - tempindex)); playerList.Add(name.ToUpper(), new Player(name, cost, race, team, ARRAYSIZE, TOTALGAMES, pointModifier)); } catch (Exception e) { errorwriter.Write("Error reading player list (" + e.Message + ")"); } finally { index = source.IndexOf("<img src='/tlpd/images/", index); } } while (index < tableEnd && index != -1); // Output log entry errorwriter.Write("Info for " + playerList.Count + " players read"); }
/// <summary> /// Parses liquipedia match info for win/loss data /// </summary> /// <param name="input">Liquipedia markup</param> /// <param name="maximumWeeks">Maximum weeks to consider</param> public void ParseMarkup(string input, int maximumWeeks) { int index = 0; int tempindex = 0; int week = 0; int match = 0; maxWeeks = maximumWeeks; if (maximumWeeks <= 0 || maximumWeeks > ARRAYSIZE) { maximumWeeks = ARRAYSIZE; } // Loop through markup looking for match data index = input.IndexOf("HiddenSort|Round", index); while (index != -1) { try { // Get the week number index = input.IndexOf("W", index) + 1; week = Convert.ToInt32((input.Substring(index, 1))); if (week > maximumWeeks) { index = input.IndexOf("HiddenSort|Round", index); continue; } // Get the match number index = input.IndexOf("- Match ", index) + "- Match ".Length; match = Convert.ToInt32((input.Substring(index, 1))); string boxData; // If "TeamMatch" isn't found within 20 characters, // there is a good chance that the infobox is stored on a different page // We need to retrieve that box if (input.IndexOf("TeamMatch", index) - index > 20 || input.IndexOf("TeamMatch", index) < 0) { index = input.IndexOf("{{:", index); tempindex = input.IndexOf("\n", index); string url = input.Substring(index, tempindex - index); url = url.Replace("{{:", string.Empty); url = url.Replace("}}", string.Empty); WebFetch boxFetch = new WebFetch(WIKIBASE + url + "&action=edit", errorwriter); boxFetch.ReduceToWikiMarkup(); boxData = boxFetch.pageContent; } else { index = input.IndexOf("TeamMatch", index); boxData = input.Substring(index, input.IndexOf("}}", index) - index); } boxParser(boxData, week); index = input.IndexOf("HiddenSort|Round", index); } catch (Exception e) { errorwriter.Write("Error during markup parsing (" + e.Message + ")"); } } errorwriter.Write("Parse complete"); }
/// <summary> /// Responds when buttonParse is clicked /// </summary> /// <param name="sender">Object calling this function</param> /// <param name="e">Event arguments</param> private void buttonParse_Click(object sender, EventArgs e) { // Get HTML from Liquipedia toolStripStatusLabel.Text = "Retrieving Liquipedia page"; WebFetch page = new WebFetch(textBoxURL.Text + "&action=edit", errorwriter); if (page.pageContent != string.Empty) { page.ReduceToWikiMarkup(); if (page.pageContent.IndexOf("#REDIRECT") != -1) { int start = page.pageContent.IndexOf("[[") + 2; int end = page.pageContent.IndexOf("]]"); page = new WebFetch(WIKIBASE + page.pageContent.Substring(start, end - start) + "&action=edit", errorwriter); page.ReduceToWikiMarkup(); } Stats statistics = new Stats(errorwriter, Convert.ToDouble(textBoxPointMod.Text)); // Limit the number of weeks we consider int maxWeeks; bool result = int.TryParse(textBoxWeeks.Text, out maxWeeks); if (!result) { maxWeeks = 0; } // Read in data from the webpage toolStripStatusLabel.Text = "Parsing webpage"; statistics.ParseMarkup(page.pageContent, maxWeeks); // Print all the data we've retrieved statistics.PrintPlayerStats(); statistics.PrintPlayerTrVal(); statistics.PrintTeamStats(); statistics.PrintTeamTrVal(); // Calculate the best team toolStripStatusLabel.Text = "Calculating best main team"; statistics.BestMainWithoutTrades(); toolStripStatusLabel.Text = "Solution complete"; } else { toolStripStatusLabel.Text = "Error retrieving Liquipedia page"; MessageBox.Show("Could not retrieve page. Check your connection."); } }