Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
                }
            }
        }