public override bool Match(TcpPacket tcpPacket, IPPacket ipPacket) { return(PKImporterHelper.IsPortMatch(tcpPacket.SourcePort) || PKImporterHelper.IsPortMatch(tcpPacket.DestinationPort)); }
/// <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); } } }