/// <summary> /// This function opens a web browser and searches for the specified mining mineral on edtools.cc/miner /// </summary> /// <param name="driver">The webdriver used to display the webpage</param> /// <param name="vaProxy">The VoiceAttackProxy object</param> /// <param name="lastKnownSystem">The last known system that you want to search for as the reference system</param> public static bool SearchForMiningData(IWebDriver driver, VoiceAttackProxy vaProxy, string lastKnownSystem) { try { driver.Url = Constants.MiningSearchUrl; var refInput = driver.FindElement(By.XPath(Constants.MiningReferenceSystemXPath)); refInput.SendKeys(lastKnownSystem); } catch (Exception) { vaProxy.WriteToLog(Constants.ErrorMessageMiningSearchRefSystemInputLocatorFailed, LogColors.LogColor.red); return(false); } try { string?mineral = vaProxy.GetText(Constants.VoiceAttackMiningVariable); switch (mineral.ToLower().Replace(" ", "")) { case "painite": TargetPath = Constants.MiningPainiteButtonXPath; break; case "voidopals": TargetPath = Constants.MiningVoidOpalButtonXPath; break; case "benitoite": TargetPath = Constants.MiningBenitoiteButtonXPath; break; case "serendibite": TargetPath = Constants.MiningSerendibiteButtonXPath; break; case "musgravite": TargetPath = Constants.MiningMusgraviteButtonXPath; break; default: TargetPath = Constants.MiningLtdButtonXPath; break; } var target = driver.FindElement(By.XPath(TargetPath)); target.Click(); vaProxy.SetBoolean(Constants.VoiceAttackWebDriverSuccessVariable, true); return(true); } catch (Exception) { vaProxy.WriteToLog(Constants.ErrorMessageMiningSearchButtonFailed, LogColors.LogColor.red); return(false); } }
/// <summary> /// Opens Inara in a webdriver browser and searches for the specified T criteria. Will automatically put in the fields to search for and the last known system the player exited supercruise at /// </summary> /// <typeparam name="T">The enum that you are searching for</typeparam> /// <param name="vaProxy">VoiceAttackProxy object</param> /// <param name="url">The url that you want the webdriver to open</param> /// <param name="vaVarName">The voice attack variable that you want to be parsed to match T</param> /// <param name="lastKnownSystem">The last known system that the player exited supercruise at if available(Defaults to Sol)</param> public bool OpenInara <T>(VoiceAttackProxy vaProxy, string url, string vaVarName, string lastKnownSystem) where T : Enum { Enum?_addUrlEnd = null; if (typeof(T) != typeof(MaterialTraderTypes.MaterialTraderType)) { _addUrlEnd = EnumParser.ParseStringToEnum <T>(vaProxy, vaVarName, typeof(T)); if (_addUrlEnd == null) { vaProxy.WriteToLog($"An error occurred. Parsed value is null", LogColors.LogColor.red); return(false); } } try { /*Current workaround if the user closes the spawned webdriver or web browser window. This slows down the application as it has to wait on a time out exception * to be throw in order to set the driver to null therefore allowing the GetDriver method to return a new ChromeDriver. This is the only way I can currently enforce * driver to be a singleton in order to prevent the plugin from opening multiple chrome windows each time that a command is ran. */ if (isBrowserClosed()) { Driver = null; } Driver = GetDriver(); #region Set url based on search context try { if (typeof(T) == typeof(Ships.Ship)) { var shipUrlPost = Constants.ShipSearchPreFix + Convert.ToInt32(_addUrlEnd); Driver.Url = url + shipUrlPost; } else if (typeof(T) == typeof(MaterialTraderTypes.MaterialTraderType)) { Driver.Url = url; } else { Driver.Url = url + Convert.ToInt32(_addUrlEnd); } } catch (Exception) { vaProxy.WriteToLog($"ERROR: Could not connect to the webdriver, Check your network connection and try again", LogColors.LogColor.red); return(false); } #endregion #region Module and Ship Search //Searches based on the Module and Ship search context if (typeof(T) == typeof(Modules.Module) || typeof(T) == typeof(Ships.Ship)) { try { var name = Driver.FindElement(By.CssSelector(Constants.ModuleNameCssSelector)); var module_name = name.Text; var input = Driver.FindElement(By.CssSelector(Constants.ModuleShipInputCssSelector)); input.SendKeys(module_name); Thread.Sleep(500); if (typeof(T) == typeof(Ships.Ship)) { input.SendKeys(Keys.Enter); } if (typeof(T) == typeof(Modules.Module)) { var webElements = Driver.FindElements(By.TagName("li")); foreach (var element in webElements) { if (element.Text.ToLower() == module_name.ToLower()) { element.Click(); } } } var near = Driver.FindElement(By.XPath(Constants.ModuleShipNearestSystemInputXPath)); near.Clear(); near.SendKeys(lastKnownSystem); near.SendKeys(Keys.Enter); var submit = Driver.FindElement(By.CssSelector(Constants.ModuleShipSubmitButtonCssSelector)); submit.Click(); } catch (Exception e) { vaProxy.WriteToLog($"An error occurred looking up the module", LogColors.LogColor.red); vaProxy.WriteToLog($"{e.StackTrace}", LogColors.LogColor.pink); vaProxy.WriteToLog($"{e.Message}", LogColors.LogColor.pink); return(false); } } #endregion #region Commodity Search //Commodity search specific code if (typeof(T) == typeof(Commodities.Commodity)) { var starSystemSearch = Driver.FindElement(By.XPath(Constants.CommodityStarSystemSearchXPath)); starSystemSearch.SendKeys(lastKnownSystem); starSystemSearch.SendKeys(Keys.Enter); if (vaProxy.GetText("buyorsell") == "buy") { var exports = Driver.FindElement(By.XPath(Constants.CommodityExportsButtonXPath)); exports.Click(); } } #endregion if (typeof(T) == typeof(MaterialTraderTypes.MaterialTraderType)) { var matTraderCheckBox = Driver.FindElement(By.XPath("//*[@id=\"galaxysearchstations\"]/div/form/div[3]/div[6]/div/label")); matTraderCheckBox.Click(); var systemSearchBox = Driver.FindElement(By.Id("autocompletestar")); systemSearchBox.Clear(); systemSearchBox.SendKeys(lastKnownSystem); Thread.Sleep(1000); systemSearchBox.SendKeys(Keys.Enter); var table = Driver.FindElement(By.XPath("//*[@id=\"DataTables_Table_0\"]/tbody")); var results = table.FindElements(By.TagName("tr")); IWebElement match = null; IWebElement clipBoard = null; int lightSeconds = 0; string stationName = string.Empty; string starSystem = string.Empty; foreach (var result in results) { var data = result.FindElements(By.TagName("td")); foreach (var item in data) { if (item.Text.Contains("Ls")) { lightSeconds = int.Parse(item.Text.Replace("Ls", "").Replace(" ", "").Replace(",", "")); } if (item.Text.ToLowerInvariant() == vaProxy.GetText(Constants.VoiceAttackMaterialTraderTypeVariable).ToLowerInvariant() && (lightSeconds <= 5000)) { match = result; goto Loopend; } } } Loopend: if (match == null) { return(false); } var matchData = match.FindElements(By.TagName("td")); var lineRight = match.FindElements(By.ClassName("lineright")); var pattern = @"(starsystem)"; foreach (var item in matchData) { var links = item.FindElements(By.TagName("a")); foreach (var link in links) { if (Regex.Match(link.GetAttribute("href"), pattern, RegexOptions.IgnoreCase).Success) { starSystem = link.Text; break; } } foreach (var i in lineRight) { var childen = i.FindElements(By.CssSelector("*")); foreach (var c in childen) { if (c.GetAttribute("class").Contains("toclipboard")) { clipBoard = c; goto FoundClipboard; } } } FoundClipboard: if (item.GetAttribute("class").Contains("wrap")) { stationName = item.FindElement(By.ClassName("inverse")).Text; } } if (clipBoard != null) { clipBoard.Click(); } vaProxy.SetText(Constants.VoiceAttackMaterialTraderStation, stationName); vaProxy.SetText(Constants.VoiceAttackMaterialStarSystem, starSystem); } vaProxy.SetBoolean(Constants.VoiceAttackWebDriverSuccessVariable, true); return(true); } catch (Exception e) { DisplayWebDriverError(vaProxy, e); return(false); } }