private static void FindNewTables(object state)
        {
            // Kill if bwin is not running
            Process[] p = Process.GetProcessesByName("bwinbe"); // todo: broaden this with PP and bwin wildcard searches
            if (p.Count() == 0)
            {
                return;
            }

            // Find all poker tables (bwin table class is #32770 - window title contains $ (other applications also use this class name)
            var tableHandles = WHelper.EnumAllWindows(IntPtr.Zero, "#32770").Where(hWnd => WHelper.GetWindowTitle(hWnd).Contains("$"));

            lock (Table.KnownTables)
            {
                // Register any new tables & start watching them
                foreach (var handle in tableHandles.Where(h => Table.Find(h, false) == null))
                {
                    // Verify that it is indeed a table window (tourney lobbeys will also be found
                    // Check for random element that only exists in tables
                    if (WHelper.EnumAllWindows(handle, "Static").Where(hWnd => WHelper.GetWindowTitle(hWnd).Contains("Fold to any bet")).Count() > 0)
                    {
                        // Register the table
                        string winTitle = WHelper.GetWindowTitle(handle);
                        Logger.Log($"Registering new bwin table: {handle} - " + winTitle);
                        Table table = new Table(handle);
                        GHelper.SafeThreadStart(() => WatchTable(table));
                    }
                }
            }
        }
Beispiel #2
0
        public static void Start()
        {
            StartTime = DateTime.Now;
            if (IsRunning == null) // First call to start
            {
                // Regularly looks for new log files & starts watching any found
                IsRunning = true;
                timer     = new Timer(WatchNewLogFiles, null, 0, 10000);
            }
            else if (IsRunning == false) // Restart
            {
                // Restarts watch on all known log files
                IsRunning = true;
                lock (activeLogFiles)
                {
                    foreach (string logFile in activeLogFiles)
                    {
                        GHelper.SafeThreadStart(() => WatchLog(logFile));
                    }
                }
            }

            // Register all open tables on startup / restart
            WHelper.EnumAllWindows(IntPtr.Zero, "PokerStarsTableFrameClass").ToList()
            .ForEach(h => Table.Find(h, registerMissing: true));
        }
        private static void WatchTable(Table table)
        {
            bool   tableIsClosed = false;
            IntPtr foldHandle    = IntPtr.Zero;

            //IntPtr checkCallHandle = IntPtr.Zero;
            //IntPtr betRaiseHandle = IntPtr.Zero;

            // Wait for buttons to initially appear & define their handles
            while (foldHandle == IntPtr.Zero && (bool)IsRunning && (bool)App.Current.Properties["IsRunning"])
            {
                // Check if window was destroyed
                if (!WHelper.IsWindow(table.WindowHandle))
                {
                    table.Close();
                    tableIsClosed = true;
                    break;
                }

                // List table elements
                var afxWnd90uElements  = WHelper.EnumAllWindows(table.WindowHandle, "AfxWnd90u");
                var afxWnd90uWinTitles = WHelper.GetAllWindowTitles(afxWnd90uElements);

                // Try to find button handles
                if (afxWnd90uWinTitles.Where(x => x.Value == "Fold ").Count() > 0)
                {
                    foldHandle = afxWnd90uWinTitles.Where(x => x.Value == "Fold ").FirstOrDefault().Key;
                    //checkCallHandle = afxWnd90uWinTitles.Where(x => x.Value == "Check" || x.Value.Contains("Call")).FirstOrDefault().Key;
                    //betRaiseHandle = afxWnd90uWinTitles.Where(x => x.Value.Contains("Bet") || x.Value.Contains("Raise")).FirstOrDefault().Key;
                    Logger.Log($"Found buttons for {table.WindowHandle} - F:{foldHandle}"); // C:{checkCallHandle} B:{betRaiseHandle}");
                    Table.SetPriority(table.WindowHandle, Table.Status.ActionRequired);     // Call action required for the first time
                }
                else
                {
                    // Wait & try again
                    Thread.Sleep(500);
                }
            }

            // Watch for action changes
            bool lastVisibleState = false;

            if (!tableIsClosed)
            {
                while ((bool)IsRunning && (bool)App.Current.Properties["IsRunning"])
                {
                    // Change priority if shown status changed
                    bool newVisibleState = WHelper.IsWindowVisible(foldHandle);
                    if (newVisibleState != lastVisibleState)
                    {
                        // Check if action required or fold button turned into "I am back" button
                        if (lastVisibleState && !WHelper.GetWindowTitle(foldHandle).Contains("Fold"))
                        {
                            table.Priority = Table.Status.OpenButNotJoined; // Sitting out
                        }
                        else
                        {
                            table.Priority = newVisibleState ?
                                             Table.Status.ActionRequired : Table.Status.NoActionRequired;
                        }

                        // Set last visible state to current one
                        lastVisibleState = newVisibleState;
                    }

                    // Check if window was destroyed
                    if (!lastVisibleState && !WHelper.IsWindow(foldHandle))
                    {
                        table.Close();
                        break;
                    }

                    // Sleep
                    Thread.Sleep(100);
                }
            }
        }