/// <summary> /// Process stream data /// </summary> /// <param name="data">Stream data</param> /// <returns>Result of processing</returns> public virtual void ProcessData(byte[] data) { try { var catcherDataObject = CreateDataObject(data); // skip if UID is empty if (catcherDataObject == null || string.IsNullOrEmpty(catcherDataObject.uid)) { return; } var tableUid = BovadaConverters.ConvertHexStringToUint32(catcherDataObject.uid); TryMergeTables(tableUid, catcherDataObject.handle); if (!openedTables.ContainsKey(tableUid)) { AddTable(tableUid); } var catcherTable = openedTables[tableUid]; catcherTable.ProcessCommand(catcherDataObject); } catch (Exception ex) { LogProvider.Log.Error(this, "Stream data was in wrong format", ex); } }
private void ProcessZoneData(string url, string data) { try { data = data.Remove(0, url.Length).Trim(); var zoneTableInfoList = JsonConvert.DeserializeObject <IEnumerable <ZoneTableInfo> >(data); rwLock.EnterUpgradeableReadLock(); try { foreach (var zoneTableInfo in zoneTableInfoList) { if (tableData.ContainsKey(zoneTableInfo.gameId)) { continue; } if (!rwLock.IsWriteLockHeld) { rwLock.EnterWriteLock(); } var table = new IgnitionTableData { Id = zoneTableInfo.gameId, TableName = zoneTableInfo.gameName, IsZone = true, TableSize = zoneTableInfo.seats, GameType = BovadaConverters.ConvertGameType(zoneTableInfo.gameType), GameLimit = BovadaConverters.ConvertGameLimit(zoneTableInfo.limit), GameFormat = GameFormat.Zone }; tableData.Add(zoneTableInfo.gameId, table); } } finally { if (rwLock.IsWriteLockHeld) { rwLock.ExitWriteLock(); } rwLock.ExitUpgradeableReadLock(); } } catch (Exception e) { LogProvider.Log.Error(this, $"Zone info could not be processed {site}", e); } }
/// <summary> /// Merge tables with same handle /// </summary> /// <param name="tableUid">Key to merge into</param> /// <param name="handleText"></param> private void TryMergeTables(uint tableUid, string handleText) { // it is possible to have more than 1 table with same handle, because of disconnection if (string.IsNullOrEmpty(handleText) || handleText.Equals("0xFFFFFFFF")) { return; } var handle = BovadaConverters.ConvertHexStringToInt32(handleText); lock (openedTables) { var tablesToMerge = openedTables.Where(x => x.Value.WindowHandle.ToInt32() == handle && x.Key != tableUid); if (tablesToMerge.Any()) { var mergeTable = tablesToMerge.Last(); openedTables.Remove(mergeTable.Key); openedTables[tableUid] = mergeTable.Value; } } }
protected override void UpdateHandNumberCommand() { // if info didn't come for some reason trying to use title of window if (!isConnectedInfoParsed) { var title = WinApi.GetWindowText(WindowHandle); LogProvider.Log.Warn($"Table data hasn't been detected from stream. Use table title '{title}' [{WindowHandle}] [{Identifier}]"); GameType = BovadaConverters.ConvertGameTypeFromTitle(title); GameFormat = BovadaConverters.ConvertGameFormatFromTitle(title); GameLimit = BovadaConverters.ConvertGameLimitFromTitle(title); MaxSeat = MaxSeat == 0 ? 9 : MaxSeat; if (GameFormat == GameFormat.SnG || GameFormat == GameFormat.MTT) { TableName = BovadaConverters.ParseTableNameFromTitle(title); } TableId = (uint)RandomProvider.GetThreadRandom().Next(12000001, 19999999); } base.UpdateHandNumberCommand(); }
private void ProcessCashData(string url, string data) { try { var uri = new Uri(url); var parsedQueryString = HttpUtility.ParseQueryString(uri.Query); var tableSeatsText = parsedQueryString.Get("tableSeats"); var limitText = parsedQueryString.Get("limitType"); var gameTypeText = parsedQueryString.Get("gameType"); if (string.IsNullOrWhiteSpace(data)) { LogProvider.Log.Warn("CashData was empty."); return; } var tableText = ReadJsonData(data, "table"); uint tableId; if (!uint.TryParse(tableText, out tableId)) { if (isLoggingEnabled) { LogProvider.Log.Error(this, $"Table id couldn't be parsed from: {tableText} [{data}]"); } return; } int tableSize; if (!int.TryParse(tableSeatsText, out tableSize)) { if (isLoggingEnabled) { LogProvider.Log.Error(this, $"Table size couldn't be parsed from: {tableSeatsText} [{data}]."); } return; } rwLock.EnterUpgradeableReadLock(); try { if (tableData.ContainsKey(tableId)) { return; } rwLock.EnterWriteLock(); try { var table = new IgnitionTableData { Id = tableId, TableSize = tableSize, GameFormat = GameFormat.Cash, GameLimit = BovadaConverters.ConvertGameLimit(limitText), GameType = BovadaConverters.ConvertGameType(gameTypeText) }; tableData.Add(tableId, table); LogProvider.Log.Info($"Table info has been read from client: {table} [{site}]"); } finally { rwLock.ExitWriteLock(); } } finally { rwLock.ExitUpgradeableReadLock(); } } catch (Exception e) { LogProvider.Log.Error(this, $"Cash info could not be processed {site}", e); } }
private void ProcessTournamentData(string url, string data) { try { var tournLastIndex = url.LastIndexOf("/"); var tournFistIndex = url.LastIndexOf("/", tournLastIndex - 1) + 1; var tournamentText = url.Substring(tournFistIndex, tournLastIndex - tournFistIndex); uint tounamentId; if (!uint.TryParse(tournamentText, out tounamentId)) { if (isLoggingEnabled) { LogProvider.Log.Error(this, $"Tournament id couldn't be parsed from: {tournamentText}"); } return; } var seatText = ReadJsonData(data, "\"seats\""); var maxPlayersText = ReadJsonData(data, "maxPlayers"); var limitText = ReadJsonTextData(data, "limit"); var gameTypeText = ReadJsonTextData(data, "gameType"); var tournamentName = ReadJsonTextData(data, "tournamentName"); if (string.IsNullOrEmpty(seatText) && string.IsNullOrEmpty(maxPlayersText)) { if (isLoggingEnabled) { LogProvider.Log.Warn(this, $"Seat and max players data hasn't been found."); } return; } int seat; if (!int.TryParse(seatText, out seat)) { if (isLoggingEnabled) { LogProvider.Log.Error(this, $"Seat couldn't be parsed from: {seatText}"); } return; } int maxPlayers; if (!int.TryParse(maxPlayersText, out maxPlayers) && isLoggingEnabled) { LogProvider.Log.Error(this, $"Max players couldn't be parsed from: {maxPlayersText}"); } var gameLimit = BovadaConverters.ConvertGameLimit(limitText); var table = new IgnitionTableData { Id = tounamentId, TableSize = seat, GameFormat = maxPlayers > seat ? GameFormat.MTT : GameFormat.SnG, GameLimit = gameLimit, GameType = BovadaConverters.ConvertGameType(gameTypeText), TableName = tournamentName }; rwLock.EnterUpgradeableReadLock(); try { if (tableData.ContainsKey(tounamentId)) { return; } rwLock.EnterWriteLock(); try { tableData.Add(tounamentId, table); LogProvider.Log.Info(this, $"Tournament table info has been read from client: {table} [{site}]"); } finally { rwLock.ExitWriteLock(); } } finally { rwLock.ExitUpgradeableReadLock(); } } catch (Exception e) { LogProvider.Log.Error(this, $"Tournament info could not be processed {site}", e); } }