From 371972b7928e88f6b688da2f8a59f61ddf19f91f Mon Sep 17 00:00:00 2001 From: ryancrunchi Date: Thu, 10 Jan 2019 15:44:49 +0100 Subject: [PATCH] Elapsed time checking for PubJoin. Added a clickGame function to ControlAction. Added a getGameElapsedTime function to ControlAction. Added a maximum seconds game elapsed check to avoid joining games near end. --- d2bs/kolbot/D2BotPubJoin.dbj | 25 ++++++++--- d2bs/kolbot/libs/OOG.js | 85 ++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 5 deletions(-) diff --git a/d2bs/kolbot/D2BotPubJoin.dbj b/d2bs/kolbot/D2BotPubJoin.dbj index 4b3177de3..6544b9bb5 100644 --- a/d2bs/kolbot/D2BotPubJoin.dbj +++ b/d2bs/kolbot/D2BotPubJoin.dbj @@ -51,6 +51,10 @@ var ExcludeFilter = [ [""] ]; +// If game elapsed time is more than this value, bot won't join. +// Set to -1 to not check elapsed time. +var maxElapsedTime = 90; + // ############################################################################### function includeCheck(game) { @@ -469,11 +473,22 @@ MainSwitch: for (i = 0; i < gameList.length; i += 1) { if (doneGames.indexOf(gameList[i].gameName) === -1 && includeCheck(gameList[i].gameName) && excludeCheck(gameList[i].gameName)) { - print("ÿc7Game: " + gameList[i].gameName + ", Players: " + gameList[i].players); - - gameToJoin = gameList[i].gameName; - - break; + if (maxElapsedTime > 0) { + var elapsedTime = ControlAction.getGameElapsedTime(gameList[i].gameName); + if (elapsedTime > -1 && elapsedTime < maxElapsedTime) { + print("ÿc7Game: " + gameList[i].gameName + ", Players: " + gameList[i].players + ", Elapsed Time: " + elapsedTime); + gameToJoin = gameList[i].gameName; + break; + } + else { + delay(rand(200,1000)); + } + } + else { + print("ÿc7Game: " + gameList[i].gameName + ", Players: " + gameList[i].players); + gameToJoin = gameList[i].gameName; + break; + } } } diff --git a/d2bs/kolbot/libs/OOG.js b/d2bs/kolbot/libs/OOG.js index 68db09d49..e80794f40 100644 --- a/d2bs/kolbot/libs/OOG.js +++ b/d2bs/kolbot/libs/OOG.js @@ -1137,6 +1137,91 @@ MainLoop: } return false; + }, + + // Click a game in the games list, by scrolling automatically if needed. + clickGame: function(gameName) { + if (!gameName || gameName.length == 0) { + return false; + } + var gameListControl = getControl(4, 432, 393, 160, 173); + if (gameListControl) { + var text = gameListControl.getText(); + if (text) { + var gamesPerPage = 9; + var gameEntryHeight = Math.round(gameListControl.ysize/gamesPerPage); + for (var i = 0; i < text.length; i++) { + if (text[i][0] == gameName) { + var topListY = gameListControl.y - gameListControl.ysize; // top of list + var midX = gameListControl.x + Math.round(gameListControl.xsize/2); // mid X list coord + if (i >= gameListControl.selectstart && i <= gameListControl.selectstart+gamesPerPage-1) { + var indexClick = i-gameListControl.selectstart; + var y = Math.round(topListY + indexClick*gameEntryHeight + gameEntryHeight/2); + gameListControl.click(midX, y); + return true; + } + else { + var scrollX = gameListControl.x + gameListControl.xsize + 5; // scrollbar X coord + var topScrollY = topListY+15; // scrollbar top Y coord + var bottomScrollY = gameListControl.y-15; // scrollbar bottom Y coord + if (i > gameListControl.selectstart+gamesPerPage-1) { + // scroll bottom + gameListControl.click(scrollX, bottomScrollY); + return this.clickGame(gameName); + } + else { + // scroll top + gameListControl.click(scrollX, topScrollY); + return this.clickGame(gameName); + } + } + } + } + } + } + return false; + }, + + // Returns the elapsed time of the game in seconds, by looking at elapsed time info. + // Returns -1 if the elapsed time could not be found. + // gameName : The game name to look for, if not set, will look at current selected game info. + getGameElapsedTime: function(gameName) { + var gameInfoControl = getControl(4, 609, 393, 143, 194); + if (gameName) { + if (this.clickGame(gameName)) { + var i = 0; + while(!gameInfoControl && i < 30) { + delay(100); + gameInfoControl = getControl(4, 609, 393, 143, 194); + i++; + } + } + else { + return -1; + } + } + if (gameInfoControl) { + var text = gameInfoControl.getText(); + var i = 0; + while(!text && i < 30) { + delay(100); + text = gameInfoControl.getText(); + i++; + } + if (text) { + for (var i = 0; i < text.length; i++) { + var timeRegExp = /\d+:\d{2}:\d{2}/i; + var match = text[i].match(timeRegExp); + if (match) { + var values = match[0].split(":"); + var date = new Date(0, 0, 0, values[0], values[1], values[2], 0); + var elapsedSeconds = date.getHours()*3600 + date.getMinutes()*60 + date.getSeconds(); + return elapsedSeconds; + } + } + } + } + return -1; } };