private void FocusLobby(LobbyLayout layout, Iterator <Image> screen) { Log.Info("selecting lobby"); for (int tries = 0; tries < 5; tries++) { // check { Image lobbyCorner = screen.next().crop(0, 300, 0, 300); if (PatternLocator.isLoggedInLobbyVisible(lobbyCorner)) { return; } } // focus { Point taskbarLobby = TaskBarLobby(layout); mouse.MoveAndLeftClick(taskbarLobby.X, taskbarLobby.Y, 10, 10); Thread.Sleep(700); } // check { Image lobbyCorner = screen.next().crop(0, 300, 0, 300); if (PatternLocator.isLoggedInLobbyVisible(lobbyCorner)) { return; } } } throw new Exception("cannot focus lobby"); }
private List <Point> TaskBarPrograms(LobbyLayout lobby, Image screenshot) { // screenshot Log.Debug("device control display dimensions {W=" + deviceControl.DisplayWidth + ",H=" + deviceControl.DisplayHeight + "} crop area {X=" + lobby.Taskbar.X + ",Y=" + lobby.Taskbar.Y + "}"); Image taskbar = screenshot.crop(lobby.Taskbar.X, deviceControl.DisplayWidth, lobby.Taskbar.Y, deviceControl.DisplayHeight - 2); List <Point> icons = PatternLocator.locateTaskBarPrograms(taskbar, lobby.Taskbar.X, lobby.Taskbar.Y); Log.Info("found " + icons.Count + " taskbar icons"); return(icons); }
private TableContainer FocusTable(LobbyLayout layout, List <TableContainer> candidates, Point taskBarPosition) { Iterator <Image> screen = new ScreenImageIterator(deviceControl); int tries = 0; while (true) { // tries if (tries > 2) { ErrorHandler.ReportException(new Exception("cannot focus table"), "focus table"); return(TABLE_NOT_FOUND); } // check for other window Image screenshot = screen.next(); // press buttons if (PressCheckOrFold(screenshot)) { continue; } // click task bar int randomOff = (int)(random.NextDouble() * 3); mouse.Move(taskBarPosition.X + randomOff, taskBarPosition.Y + randomOff); Thread.Sleep(150); mouse.LeftClick(); Thread.Sleep(350); // check for other window screenshot = screen.next(); // check focus foreach (TableContainer table in candidates) { if (IsTableVisible(table, CropTable(screenshot, table.Layout))) { return(table); } } // move somewhere else mouse.Move(taskBarPosition.X - 100, taskBarPosition.Y - 50); Thread.Sleep(200 + tries * 100); // tries tries++; } }
public static void Main(string[] args) { Thread.Sleep(10 * 1000); LobbyIdentifier identifier = new LobbyIdentifier(); DeviceControl device = new Win32Control(); Image screenshot = new ScreenImageIterator(device).next(); Point offset = PatternLocator.locateLobby(screenshot); LobbyLayout layout = new LobbyLayout(); Image window = screenshot.crop(offset.X, screenshot.width, offset.Y, screenshot.height); Image tableList = window.crop(layout.TableList.X, layout.TableList.X + layout.TableList.Width, layout.TableList.Y, layout.TableList.Y + layout.TableList.Height); List <LobbyTable> lobbyTables = identifier.identifyLobbyTables(tableList, offset); foreach (LobbyTable lobby in lobbyTables) { Console.WriteLine(lobby.ToString()); } }
public static void Main(string[] args) { Log.SetLevel(Log.Level.FINEST); Iterator <Image> screenIter; if (USE_SCREEN) { // wait Log.Info("waiting ..."); Thread.Sleep(5000); // full screen Console.WriteLine("## scanning for lobby ##"); Image fullScreen = new ScreenImageIterator(new Win32Control()).next(); Point offset = PatternLocator.locateLobby(fullScreen); Console.WriteLine("lobby found at x=" + offset.X + " y=" + offset.Y); // desk LobbyLayout layout = new LobbyLayout(); screenIter = new ScreenImageIterator(new Win32Control(), new Rectangle(offset.X + layout.TableList.X, offset.Y + layout.TableList.Y, layout.TableList.Width, layout.TableList.Height)); } else { screenIter = new MockOneImageIterator(toImage(new Bitmap("test/lobby1.bmp"))); } // screen + reduce + invert Iterator <Image> reduceIter = new ReduceColorIterator(screenIter, new ColorReducers.LobbyChars()); Iterator <Image> replaceIter = new ReplaceColorIterator(reduceIter, Color.White, Color.Transparent); // proxy ImagesRenderer renderer = newImageRenderer(); IteratorProxy <Image> proxyIter = new IteratorProxy <Image>(replaceIter); ColorReplacer replacer = new ColorReplacer(Color.Transparent, Color.Cyan); proxyIter.handler += delegate(Image next) { setImage(renderer, toBitmap(replacer.replace(next))); }; // partition + decompose + crop Iterator <List <List <Image> > > patitionIter = new ImageHoriPartitionIterator(proxyIter); Iterator <List <List <Image> > > cropIter = new CropImageIterator(patitionIter); // patterns List <CharPattern> patterns = CharReader.readCharsFromResourcesLobby(); CharIdentifier identifier = new CharIdentifier(patterns); // identify int count = 0; while (cropIter.hasNext()) { List <List <Image> > lines = cropIter.next(); // line foreach (List <Image> line in lines) { // chars String textLine = ""; foreach (Image chars in line) { List <Image> combos = CharDecomposer.decompose(chars, 0); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); textLine += identifyChars(identifier, character, ref count); } } Console.WriteLine(textLine); } } }
private List <LobbyTable> IdentifyLobbyTables(LobbyIdentifier lobbyIdentifier, LobbyLayout layout, Iterator <Image> screen, Point offset) { for (int tries = 0; tries < 10; tries++) { // time DateTime startLobby = DateTime.Now; // select last row mouse.MoveAndLeftClick(offset.X + layout.LastRow.X, offset.Y + layout.LastRow.Y, 20, 5); // move mouse mouse.Move(offset.X + layout.Mouse.X, offset.Y + layout.Mouse.Y); Thread.Sleep(100); // shot Image screenshot = screen.next(); // crop Image window = screenshot.crop(offset.X, screenshot.width, offset.Y, screenshot.height); Image tableList = window.crop(layout.TableList.X, layout.TableList.X + layout.TableList.Width, layout.TableList.Y, layout.TableList.Y + layout.TableList.Height); try { List <LobbyTable> lobbyTables = lobbyIdentifier.identifyLobbyTables(tableList, offset); // log Log.Info("identified " + lobbyTables.Count + " joinable lobby tables"); // nothing found? if (lobbyTables.Count == 0) { throw new Exception("identified 0 lobby tables, trying again"); } return(lobbyTables); } catch (Exception ex) { // handle error ErrorHandler.ReportExceptionWithImage(ex, "lobby identifier error", tableList); // sleep Thread.Sleep(1000); // focus lobby FocusLobby(layout, screen); continue; } } throw new Exception("cannot identify lobby table list"); }
public List <TableContainer> OpenNewTables(Settings settings, ImageRenderer imageRenderer, TableFoundDelegate tableDelegate) { Log.Info("## scanning for lobby ##"); // identifier LobbyIdentifier lobbyIdentifier = new LobbyIdentifier(); // set renderer tableIdentifier.Renderer = imageRenderer; lobbyIdentifier.Renderer = imageRenderer; // screen Iterator <Image> screen = new ScreenImageIterator(deviceControl); LobbyLayout layout = new LobbyLayout(); // find lobby FocusLobby(layout, screen); Image screenshot = screen.next(); Point lobbyOffset = PatternLocator.locateLobby(screenshot); // loop until we got enough tables List <TableContainer> tables = new List <TableContainer>(); while (knownTables.Count < settings.AutoLocateTablesNum) { // check for tables PressCheckOrFold(screenshot); // scan lobby List <LobbyTable> lobbyTables = IdentifyLobbyTables(lobbyIdentifier, layout, screen, lobbyOffset); // open tables? if (HasOpenTables(lobbyTables)) { // select table LobbyTable bestTable = SelectBestTable(lobbyTables); // render if (imageRenderer != null) { imageRenderer.renderImage(ImageTools.rectImage(), new Point(bestTable.RelX, bestTable.RelY)); } // open table Log.Info("opening table " + bestTable.ToString() + " with score " + String.Format("{0:0.00}", bestTable.Score)); TableContainer container = OpenTable(bestTable, settings, screen, bestTable); if (container != TABLE_ALREADY_JOINED && container != TABLE_NOT_FOUND && container != CANNOT_FIND_SEAT) { // add to known tables tables.Add(container); knownTables.Add(container); Log.Info("added new table " + tables.Count); // invoke delegate if (tableDelegate != null) { tableDelegate(container); } } // reselect lobby (otherwise automatically selected by pokerstars -> close table) if (container == TABLE_NOT_FOUND || knownTables.Count > 0) { FocusLobby(layout, screen); keyboard.pressPageUp(3); } // move up for "better" tables else { keyboard.pressPageUp(2); Thread.Sleep(100); } } else { // scroll keyboard.pressPageDown(); Thread.Sleep(1000); } } // minimize lobby Thread.Sleep(1000); return(tables); }
private Point TaskBarLobby(LobbyLayout layout) { return(new Point(layout.Taskbar.X + 25, layout.Taskbar.Y + 10)); }
public static void Main(string[] args) { Log.SetLevel(Log.Level.FINEST); Iterator <Image> screenIter; LobbyLayout layout = new LobbyLayout(); Point offset; if (USE_SCREEN) { // wait Log.Info("waiting ..."); Thread.Sleep(3000); // full screen Console.WriteLine("## scanning for lobby ##"); Image fullScreen = new ScreenImageIterator(new Win32Control()).next(); offset = PatternLocator.locateLobby(fullScreen); Console.WriteLine("lobby found at x=" + offset.X + " y=" + offset.Y); // lobby screenIter = new ScreenImageIterator(new Win32Control(), new Point(offset.X, offset.Y)); screenIter = new WaitDeltaImageIterator(screenIter); } else { offset = new Point(0, 0); screenIter = new MockOneImageIterator(toImage(new Bitmap("test/lobby1.bmp"))); } // screen + reduce + invert ColorReducer reducer = new ColorReducers.LobbyChars(); ColorReducer reducerJoined = new ColorReducers.LobbyCharsJoined(); ColorReplacer replacer = new ColorReplacer(Color.White, Color.Transparent); // renderer ImagesRenderer renderer = newImageRenderer(); ColorReplacer replacerTrans = new ColorReplacer(Color.Transparent, Color.Cyan); // patterns List <CharPattern> patterns = CharReader.readCharsFromResourcesLobby(); CharIdentifier identifier = new CharIdentifier(patterns); // identify while (screenIter.hasNext()) { // rows List <LobbyTable> rows = new List <LobbyTable>(); // image Image screen = screenIter.next(); // list Image tableList = screen.crop(layout.TableList.X, layout.TableList.X + layout.TableList.Width, layout.TableList.Y, layout.TableList.Y + layout.TableList.Height); // identify List <ValueWithY> playerCounts = identifyValues(tableList, layout.PlayersCountX, layout.PlayersCountX + layout.PlayersCountW, tableList.height, reducer, replacer, identifier, renderer); List <ValueWithY> potSizes = identifyValues(tableList, layout.PotX, layout.PotX + layout.PotW, tableList.height, reducer, replacer, identifier, renderer); List <ValueWithY> flops = identifyValues(tableList, layout.FlopsX, layout.FlopsX + layout.FlopsW, tableList.height, reducer, replacer, identifier, renderer); List <LobbyTable> tables = new List <LobbyTable>(); for (int i = 0; i < playerCounts.Count; i++) { // location int x = offset.X + layout.TableList.X + layout.TableList.Width / 2; int y = offset.Y + layout.TableList.Y + playerCounts[i].Y; // cell int celly = playerCounts[i].Y; int cellx = layout.PlayersCountX; Image cell = tableList.crop(cellx, cellx + layout.PlayersCountW, celly, celly + layout.CellHeight); bool joined = ContainsJoinedColor(cell, reducerJoined, renderer); // table tables.Add(new LobbyTable(i + 1, (int)playerCounts[i].Value, potSizes[i].Value, (int)flops[i].Value, x, y, offset.X, offset.Y, joined)); } // print foreach (LobbyTable table in tables) { Console.WriteLine(table.ToString()); } // wait Console.ReadKey(); } }