protected virtual void ProcessFastFoldNoticeGameReset(FastFoldImportDto fastFoldImportDto) { var noticeGameSnapshot = fastFoldImportDto.HandBuilder.GetNoticeRoomSnapShot(fastFoldImportDto.Package); if (noticeGameSnapshot == null || fastFoldImportDto.NoticeResetGame.Players == null || !long.TryParse(fastFoldImportDto.NoticeResetGame.GameId, out long handId)) { LogProvider.Log.Error(Logger, $"Failed to get snapshot for {fastFoldImportDto.Package.UserId} of {fastFoldImportDto.Package.RoomId} (Fast Fold)."); return; } // load players from db var playersToAdd = fastFoldImportDto.NoticeResetGame.Players .Select(x => x.Playerid.ToString()) .Where(x => !fastFoldImportDto.PlayerNamePlayerIdMap.ContainsKey(x)) .ToArray(); if (playersToAdd.Length > 0) { using (var session = ModelEntities.OpenSession()) { var playerNamePlayerIdToAdd = session.Query <Players>() .Where(x => x.PokersiteId == (short)Site && playersToAdd.Contains(x.Playername)) .Select(x => new { x.Playername, x.PlayerId }) .ToArray(); playerNamePlayerIdToAdd.ForEach(x => fastFoldImportDto.PlayerNamePlayerIdMap.Add(x.Playername, x.PlayerId)); } } var fastFoldRoomId = fastFoldImportDto.HandBuilder .GetFastFoldRoomByUser(fastFoldImportDto.Package.UserId); if (fastFoldRoomId == 0) { fastFoldRoomId = fastFoldImportDto.Package.RoomId; } var gameInfo = new GameInfo { Session = $"{fastFoldRoomId}{fastFoldImportDto.Package.UserId}", WindowHandle = fastFoldImportDto.WindowHandle.ToInt32(), PokerSite = Site, GameType = Bovada.GameType.Holdem, TableType = (EnumTableType)noticeGameSnapshot.Params.PlayerCountMax, GameFormat = GameFormat.FastFold, GameNumber = handId }; // Initialize cache gameInfo.ResetPlayersCacheInfo(); var players = new PlayerList(fastFoldImportDto.NoticeResetGame.Players.Select(x => new Player(x.Playerid.ToString(), 0, x.Seatid + 1) { PlayerId = fastFoldImportDto.PlayerNamePlayerIdMap.ContainsKey(x.Playerid.ToString()) ? fastFoldImportDto.PlayerNamePlayerIdMap[x.Playerid.ToString()] : 0, PlayerNick = x.Name })); Player heroPlayer = null; foreach (var player in players) { if (player.PlayerId == 0) { continue; } var isHero = false; if (player.PlayerName.Equals(fastFoldImportDto.Package.UserId.ToString())) { heroPlayer = player; isHero = true; } var playerCollectionItem = new PlayerCollectionItem { PlayerId = player.PlayerId, Name = player.PlayerName, PokerSite = Site }; var playerCacheStatistic = fastFoldImportDto.ImporterSessionCacheService.GetPlayerStats(gameInfo.Session, playerCollectionItem, out bool exists); if (exists && playerCacheStatistic.IsHero) { heroPlayer = player; gameInfo.GameFormat = playerCacheStatistic.GameFormat; break; } else if (!exists && gameInfo.GameFormat == GameFormat.FastFold) { var playerCacheInfo = new PlayerStatsSessionCacheInfo { Session = gameInfo.Session, GameFormat = gameInfo.GameFormat, Player = playerCollectionItem, IsHero = isHero, Stats = new Playerstatistic { SessionCode = gameInfo.Session, PokergametypeId = (short)HandHistories.Objects.GameDescription.GameType.NoLimitHoldem } }; if (playerCacheInfo.Stats.PokergametypeId != 0) { gameInfo.AddToPlayersCacheInfo(playerCacheInfo); } } } PreparePlayerList(players, noticeGameSnapshot.Params.PlayerCountMax, heroPlayer != null ? heroPlayer.SeatNumber : 0); var importedArgs = new DataImportedEventArgs(players, gameInfo, heroPlayer, 0); eventAggregator.GetEvent <DataImportedEvent>().Publish(importedArgs); }
/// <summary> /// Processes packets in the buffer /// </summary> protected void ProcessBuffer() { var emulatorService = ServiceLocator.Current.GetInstance <IEmulatorService>(); emulatorService.SetLogger(Logger); var packetManager = ServiceLocator.Current.GetInstance <IPacketManager <PokerKingPackage> >(); var handBuilder = ServiceLocator.Current.GetInstance <IPKHandBuilder>(); var connectionsService = ServiceLocator.Current.GetInstance <INetworkConnectionsService>(); connectionsService.SetLogger(Logger); var importerSessionCacheService = ServiceLocator.Current.GetInstance <IImporterSessionCacheService>(); var detectedTableWindows = new HashSet <IntPtr>(); var handHistoriesToProcess = new ConcurrentDictionary <long, List <HandHistoryData> >(); var usersRooms = new Dictionary <uint, int>(); var playerNamePlayerIdMap = new Dictionary <string, int>(); while (!cancellationTokenSource.IsCancellationRequested && !IsDisabled()) { try { if (!packetBuffer.TryTake(out CapturedPacket capturedPacket)) { Task.Delay(NoDataDelay).Wait(); continue; } if (IsAdvancedLogEnabled) { LogPacket(capturedPacket, ".log"); } if (!packetManager.TryParse(capturedPacket, out IList <PokerKingPackage> packages)) { continue; } var isFastFold = PKImporterHelper.IsFastFoldPort(capturedPacket.Destination.Port) || PKImporterHelper.IsFastFoldPort(capturedPacket.Source.Port); foreach (var package in packages) { package.IsFastFold = isFastFold; if (!IsAllowedPackage(package)) { continue; } var process = connectionsService.GetProcess(capturedPacket); var windowHandle = emulatorService.GetTableWindowHandle(process); if (!isFastFold && !TryDecryptBody(package, process, emulatorService)) { if (package.PackageType == PackageType.RequestLeaveRoom) { CloseHUD(windowHandle); detectedTableWindows.Remove(windowHandle); continue; } SendPreImporedData("Notifications_HudLayout_PreLoadingText_PK_Relogin", windowHandle); continue; } if (IsAdvancedLogEnabled) { LogPackage(package); } if (package.PackageType == PackageType.RequestJoinRoom) { ParsePackage <RequestJoinRoom>(package, body => { if (!usersRooms.ContainsKey(package.UserId)) { usersRooms.Add(package.UserId, body.RoomId); } else { usersRooms[package.UserId] = body.RoomId; } LogProvider.Log.Info(Logger, $"User {package.UserId} entered room {body.RoomId}{(isFastFold ? " (Fast Fold)" : string.Empty)}."); }, () => LogProvider.Log.Info(Logger, $"User {package.UserId} entered room{(isFastFold ? " (Fast Fold)" : string.Empty)}.")); continue; } // need to close HUD if user left room if (package.PackageType == PackageType.RequestLeaveRoom) { ParsePackage <RequestLeaveRoom>(package, body => { LogProvider.Log.Info(Logger, $"User {package.UserId} left room {body.RoomId}."); handBuilder.CleanRoom(windowHandle.ToInt32(), body.RoomId); }, () => LogProvider.Log.Info(Logger, $"User {package.UserId} left room {package.RoomId}.")); CloseHUD(windowHandle); detectedTableWindows.Remove(windowHandle); continue; } if (isFastFold && package.PackageType == PackageType.NoticeQuickLeave) { ParsePackage <NoticeQuickLeave>(package, body => { handBuilder.CleanFastFoldRooms(package, windowHandle.ToInt32(), out List <HandHistory> handHistories); foreach (var fastFoldHandHistory in handHistories) { LogProvider.Log.Info(Logger, $"Hand #{fastFoldHandHistory.HandId} user #{package.UserId} room #{package.RoomId}: Process={(process != null ? process.Id : 0)}, windows={windowHandle}."); ExportHandHistory(package, fastFoldHandHistory, windowHandle, handHistoriesToProcess, false); } LogProvider.Log.Info(Logger, $"User {package.UserId} left room {body.RoomId} (Fast Fold)."); }, () => LogProvider.Log.Info(Logger, $"User {package.UserId} left room {package.RoomId} (Fast Fold).")); CloseHUD(windowHandle); detectedTableWindows.Remove(windowHandle); continue; } var unexpectedRoomDetected = !usersRooms.TryGetValue(package.UserId, out int roomId) || roomId != package.RoomId; // add detected window to list of detected tables if (!unexpectedRoomDetected && !detectedTableWindows.Contains(windowHandle)) { detectedTableWindows.Add(windowHandle); if (package.PackageType == PackageType.NoticeGameSnapShot || handBuilder.IsRoomSnapShotAvailable(package)) { SendPreImporedData("Notifications_HudLayout_PreLoadingText_PK", windowHandle); } else { SendPreImporedData("Notifications_HudLayout_PreLoadingText_PK_CanNotBeCapturedText", windowHandle); } } if (isFastFold && unexpectedRoomDetected && package.PackageType == PackageType.NoticeResetGame) { ParsePackage <NoticeResetGame>(package, noticeResetGame => { var fastFoldImportDto = new FastFoldImportDto { HandBuilder = handBuilder, ImporterSessionCacheService = importerSessionCacheService, NoticeResetGame = noticeResetGame, Package = package, PlayerNamePlayerIdMap = playerNamePlayerIdMap, WindowHandle = windowHandle }; ProcessFastFoldNoticeGameReset(fastFoldImportDto); }, () => LogProvider.Log.Info(Logger, $"Failed to process NoticeResetGame for {package.UserId} of {package.RoomId} (Fast Fold).")); } if (handBuilder.TryBuild(package, windowHandle.ToInt32(), out HandHistory handHistory)) { if (IsAdvancedLogEnabled) { var unexpectedRoomLogMessage = string.Empty; if (unexpectedRoomDetected && !isFastFold) { unexpectedRoomLogMessage = " Unexpected room detected. No data will be sent to HUD."; } LogProvider.Log.Info(Logger, $"Hand #{handHistory.HandId} user #{package.UserId} room #{package.RoomId}: Process={(process != null ? process.Id : 0)}, windows={windowHandle}.{unexpectedRoomLogMessage}"); } ExportHandHistory(package, handHistory, windowHandle, handHistoriesToProcess, unexpectedRoomDetected); } } } catch (Exception e) { LogProvider.Log.Error(Logger, $"Could not process captured packet.", e); } } }