public void SetUp() { NoLimitHand1 = parser.ParseString(NoLimitHand1_Text).Hands[0]; }
//Note that lines is only passed for efficiency, it could be obtained //by just splitting handText private PokerHand parseHand(List<string> lines, string handText) { PokerHand hand = new PokerHand(); #region setup variables int start; int end; int curLine; List<Round> rounds = new List<Round>(); #endregion #region Make sure it's a Full Tilt hand if (!handText.StartsWith("Full Tilt Poker")) throw new InvalidHandFormatException(handText); #endregion #region Skip partial hands if(lines[0].EndsWith("(partial)")) return null; #endregion hand.Context.Online = true; hand.Context.Site = "Full Tilt Poker"; #if DEBUG Console.WriteLine("Hand Number"); #endif #region Get the hand number start = handText.IndexOf('#') + 1; end = handText.IndexOf(':'); hand.Context.ID = handText.Substring(start, end - start); #endregion #if DEBUG Console.WriteLine("Table Name"); #endif #region Get the table name start = end + 2; end = handText.IndexOf('-', start); hand.Context.Table = handText.Substring(start, end - start - 1); #endregion #if DEBUG Console.WriteLine("Blinds"); #endif #region Get the blinds and game format start = end + 2; end = handText.IndexOf('-', start); string blindsAndAntes = handText.Substring(start, end - start); int blindSeparator = blindsAndAntes.IndexOf('/'); string smallBlindText = blindsAndAntes.Substring(0, blindSeparator); if (smallBlindText[0] == '$') smallBlindText = smallBlindText.Substring(1); hand.Context.SmallBlind = Decimal.Parse(smallBlindText.Trim()); int bigBlindStart = blindSeparator + 1; int bigBlindEnd = blindsAndAntes.IndexOf(' ', bigBlindStart); string bigBlindText = blindsAndAntes.Substring(bigBlindStart, bigBlindEnd - bigBlindStart); if (bigBlindText[0] == '$') bigBlindText = bigBlindText.Substring(1); hand.Context.BigBlind = Decimal.Parse(bigBlindText.Trim()); int anteIndex = blindsAndAntes.IndexOf("Ante"); if (anteIndex != -1) { int anteStart = anteIndex + 5; string anteText = blindsAndAntes.Substring(anteStart); if (anteText[0] == '$') anteText = anteText.Substring(1); hand.Context.Ante = Decimal.Parse(anteText.Trim()); } #endregion #if DEBUG Console.WriteLine("Game Format"); #endif #region Get the game format if (hand.Context.Table.Contains("Sit & Go")) hand.Context.Format = GameFormat.SitNGo; else if (blindsAndAntes.Contains("$")) hand.Context.Format = GameFormat.CashGame; else hand.Context.Format = GameFormat.MultiTableTournament; #endregion #if DEBUG Console.WriteLine("Poker Variant and Betting Type"); #endif #region Get the betting type and poker variant start = end + 2; end = handText.IndexOf('-', start); string typeAndVariant = handText.Substring(start, end - start); int capIndex = typeAndVariant.IndexOf(" Cap "); if (capIndex != -1) { string capAmountText = handText.Substring(start, capIndex - start); hand.Context.CapAmount = Decimal.Parse(capAmountText.Trim().Replace("$", "")); hand.Context.CapAmountSpecified = true; hand.Context.Capped = true; } else { hand.Context.CapAmountSpecified = false; hand.Context.Capped = false; } if(typeAndVariant.Contains("Pot Limit")) hand.Context.BettingType = BettingType.PotLimit; else if(typeAndVariant.Contains("No Limit")) hand.Context.BettingType = BettingType.NoLimit; else hand.Context.BettingType = BettingType.FixedLimit; if (typeAndVariant.Contains("Hold'em")) hand.Context.PokerVariant = PokerVariant.TexasHoldEm; else if(typeAndVariant.Contains("Omaha Hi")) hand.Context.PokerVariant = PokerVariant.OmahaHi; else hand.Context.PokerVariant = PokerVariant.OmahaHiLo; #endregion #if DEBUG Console.WriteLine("Time Stamp"); #endif #region Get the date and time start = end + 2; end = handText.IndexOf(' ', start); string timeText = handText.Substring(start, end - start); string[] timeTokens = timeText.Split(':'); int hour = Int32.Parse(timeTokens[0]); int minute = Int32.Parse(timeTokens[1]); int second = Int32.Parse(timeTokens[2]); start = handText.IndexOf('-', end) + 2; string dateText = lines[0].Substring(start); string[] dateTokens = dateText.Split('/'); int year = Int32.Parse(dateTokens[0]); int month = Int32.Parse(dateTokens[1]); int day = Int32.Parse(dateTokens[2]); hand.Context.TimeStamp = new DateTime(year, month, day, hour, minute, second); #endregion #if DEBUG Console.WriteLine("Players"); #endif #region Create the players List<Player> players = new List<Player>(); curLine = 1; for (Match m = stacksExp.Match(lines[curLine]); m.Success; m = stacksExp.Match(lines[curLine])) { if (m.Success) { GroupCollection gc = m.Groups; Player p = new Player(); p.Seat = Int32.Parse(gc[1].Value); p.Name = gc[2].Value; p.Stack = Decimal.Parse(gc[3].Value); players.Add(p); curLine++; } } hand.Players = players.ToArray(); #endregion #if DEBUG Console.WriteLine("Blinds and Antes Posted"); #endif #region Get the blinds and antes posted List<Blind> blinds = new List<Blind>(); for (; !lines[curLine].StartsWith("The button is in seat #"); curLine++) { for (Match m = actionExp.Match(lines[curLine]); m.Success; m = m.NextMatch()) { GroupCollection gc = m.Groups; Blind blind = new Blind(); blind.Player = gc[1].Value; if (gc[2].Value == "antes") blind.Type = BlindType.Ante; else if (gc[5].Value == "small") blind.Type = gc[4].Value == "dead" ? BlindType.DeadBlind : BlindType.SmallBlind; else if (gc[5].Value == "big") blind.Type = gc[4].Value == "dead" ? BlindType.DeadBlind : BlindType.BigBlind; else if (gc[2].Value == "posts") blind.Type = BlindType.LateBlind; blind.Amount = Decimal.Parse(gc[6].Value); blind.AllIn = gc[9].Value.Length == 15; blinds.Add(blind); } } hand.Blinds = blinds.ToArray(); #endregion #if DEBUG Console.WriteLine("Button"); #endif #region Get the button string buttonText = lines[curLine].Substring(lines[curLine].IndexOf('#') + 1); hand.Context.Button = Int32.Parse(buttonText); curLine++; #endregion #if DEBUG Console.WriteLine("Hole Cards and Hero"); #endif #region Get the hole cards and the name of the hero while (!lines[curLine].StartsWith("Dealt to ")) curLine++; start = "Dealt to ".Length; end = lines[curLine].IndexOf(" [", start); hand.Hero = lines[curLine].Substring(start, end - start); start = end + 2; List<Card> holecards = new List<Card>(); holecards.Add(new Card(lines[curLine].Substring(start, 2))); holecards.Add(new Card(lines[curLine].Substring(start + 3, 2))); if (hand.Context.PokerVariant != PokerVariant.TexasHoldEm) { holecards.Add(new Card(lines[curLine].Substring(start + 6, 2))); holecards.Add(new Card(lines[curLine].Substring(start + 9, 2))); } hand.HoleCards = holecards.ToArray(); curLine++; #endregion #if DEBUG Console.WriteLine("Preflop Actions"); #endif #region Preflop Actions rounds.Add(new Round()); rounds[0].Actions = getRoundActions(lines, ref curLine); #endregion #if DEBUG Console.WriteLine("Flop Actions"); #endif #region Flop Actions and Community Cards if (lines[curLine].StartsWith("*** FLOP ***")) { rounds.Add(new Round()); start = lines[curLine].IndexOf('[') + 1; Card[] flop = new Card[3]; flop[0] = new Card(lines[curLine].Substring(start, 2)); flop[1] = new Card(lines[curLine].Substring(start + 3, 2)); flop[2] = new Card(lines[curLine].Substring(start + 6, 2)); rounds[1].CommunityCards = flop; curLine++; rounds[1].Actions = getRoundActions(lines, ref curLine); } #endregion #if DEBUG Console.WriteLine("Turn Actions"); #endif #region Turn Actions and Community Card if (lines[curLine].StartsWith("*** TURN ***")) { rounds.Add(new Round()); start = lines[curLine].LastIndexOf('[') + 1; Card[] turn = new Card[1]; turn[0] = new Card(lines[curLine].Substring(start, 2)); rounds[2].CommunityCards = turn; curLine++; rounds[2].Actions = getRoundActions(lines, ref curLine); } #endregion #if DEBUG Console.WriteLine("River Actions"); #endif #region River Actions and Community Card if (lines[curLine].StartsWith("*** RIVER ***")) { rounds.Add(new Round()); start = lines[curLine].LastIndexOf('[') + 1; Card[] river = new Card[1]; river[0] = new Card(lines[curLine].Substring(start, 2)); rounds[3].CommunityCards = river; curLine++; rounds[3].Actions = getRoundActions(lines, ref curLine); } #endregion #region Set rounds hand.Rounds = rounds.ToArray(); #endregion #if DEBUG Console.WriteLine("Results"); #endif #region Get pots won List<HandResult> results = new List<HandResult>(); List<List<Pot>> pots = new List<List<Pot>>(); for (; !lines[curLine].StartsWith("*** SUMMARY"); curLine++) { Match m = potsExp.Match(lines[curLine]); if (m.Success) { GroupCollection gc = m.Groups; Pot p = new Pot(); p.Amount = Decimal.Parse(gc[8].Value); if (gc[7].Value.Length > 0) p.Number = Int32.Parse(gc[7].Value); else if ((gc[5].Value.Length == 0 && gc[3].Value == "the pot") || gc[5].Value == "main ") p.Number = 0; else if (gc[5].Length > 0) p.Number = 1; HandResult result = null; List<Pot> potList = null; for (int i = 0; i < results.Count; i++) { if (results[i].Player == gc[1].Value) { result = results[i]; potList = pots[i]; break; } } if (result == null) { result = new HandResult(gc[1].Value); potList = new List<Pot>(); results.Add(result); pots.Add(potList); } potList.Add(p); } } //add the pots to the model for (int i = 0; i < results.Count; i++) { results[i].WonPots = pots[i].ToArray(); } //get the rake, if any if (hand.Context.Format == GameFormat.CashGame) { for (; !lines[curLine].StartsWith("Total pot") || lines[curLine].Contains(":") || !lines[curLine].Contains("| Rake "); curLine++) { } int rakeStart = lines[curLine].LastIndexOf("| Rake ") + "| Rake ".Length; string rakeText = lines[curLine].Substring(rakeStart).Replace("$", ""); hand.Rake = Decimal.Parse(rakeText); } #endregion #if DEBUG Console.WriteLine("Shown Hands"); #endif #region Get the shown down hands for (; curLine < lines.Count; curLine++) { Match m = shownHandsExp.Match(lines[curLine]); if (m.Success) { GroupCollection gc = m.Groups; List<Card> shownCards = new List<Card>(); shownCards.Add(new Card(gc[5].Value)); shownCards.Add(new Card(gc[6].Value)); if (hand.Context.PokerVariant != PokerVariant.TexasHoldEm) { shownCards.Add(new Card(gc[8].Value)); shownCards.Add(new Card(gc[9].Value)); } string player = gc[2].Value; HandResult hr = null; foreach (HandResult curResult in results) if (curResult.Player == player) { hr = curResult; break; } if (hr == null) { hr = new HandResult(player); results.Add(hr); } hr.HoleCards = shownCards.ToArray(); } } #endregion #region Set the results hand.Results = results.ToArray(); #endregion #if DEBUG Console.WriteLine("Done"); #endif return hand; }