private void CreateAhResourcesXml() { //GotoMenu("1"); CampahStatus.SetStatus("Updating AH Database. Please Wait...", Modes.Updating); AuctionHouse.Items.Clear(); interactionManager.TraverseMenu("1"); interactionManager.CloseMenu(); var tw = new XmlTextWriter("ahresources.xml", null) { Formatting = Formatting.Indented }; tw.WriteStartDocument(); tw.WriteStartElement("AHStructure"); tw.WriteComment("This XML was automatically generated by Campah.exe"); tw.WriteComment("Editing this XML may cause Campah to no longer function properly"); foreach (AhItem item in AuctionHouse.Items.Values) { tw.WriteStartElement("item"); tw.WriteAttributeString("id", item.ID.ToString("X2")); tw.WriteAttributeString("name", item.Name); tw.WriteAttributeString("stackable", item.Stackable.ToString()); tw.WriteAttributeString("address", item.Address); tw.WriteEndElement(); } tw.WriteEndElement(); tw.WriteEndDocument(); tw.Flush(); tw.Close(); interactionManager.StopBuying("Finished Updating Successfully", CreateAhResourcesXml); settingsManager.loadAHResourcesXML(); }
public void SelectProcess() { using (var p = new ProcessSelector()) { switch (p.Processes.Length) { case 1: CampahStatus.Instance.Process = p.processes[0]; break; case 0: CampahStatus.Instance.Status = "No FFXI Processes Found"; return; default: p.ShowDialog(); break; } if (CampahStatus.Instance.Process == null) { return; } FFACEInstance.Instance = null; //needs to dispose of old FFACEInstance.Instance = new FFACE(CampahStatus.Instance.Process.Id); CampahStatus.SetStatus("Attached to " + CampahStatus.Instance.Process.MainWindowTitle); } }
private int[] ReadAHItems() { int loaded = -1; CampahStatus.SetStatus("Waiting for items to load..."); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay * 4); while (loaded != AuctionHouse.LoadedCount) { loaded = AuctionHouse.LoadedCount; Thread.Sleep((int)CampahStatus.Instance.GlobalDelay * 2); } CampahStatus.SetStatus("Reading item list..."); return(AuctionHouse.ReadIDArray()); }
public static int[] ReadIDArray() { var itemids = new List <int>(); var memloc = (int)ArrayPointer; var n = LoadedCount; MemoryBuffer buffer = Preader.createSearchBuffer(memloc, (Constants.AH_OFFSET_FIRSTITEMID + Constants.AH_OFFSET_ITEMID_INCREMENT * n)); for (var i = 0; i < n; i++) { itemids.Add((int)buffer.Read2Bytes(memloc + Constants.AH_OFFSET_FIRSTITEMID + Constants.AH_OFFSET_ITEMID_INCREMENT * i)); } CampahStatus.SetStatus("Item list read complete."); return(itemids.ToArray()); }
public MainWindow() { InitializeComponent(); Height = Properties.Settings.Default.WindowSize.Height; Width = Properties.Settings.Default.WindowSize.Width; Top = Properties.Settings.Default.WindowLocation.Y; Left = Properties.Settings.Default.WindowLocation.X; CampahStatus.SetStatus("Loading Settings", Modes.Stopped); settingsManager = new FileIO(TbBuyItemSelect); settingsManager.loadSettingsXML(); if (File.Exists("Updater.exe")) { File.Delete("Updater.exe"); } SelectProcess(); rtb_chatlog.Document = Chatlog.Instance.ChatLog; }
private void LookupPriceXiAh() { AhItem item; var price = -1; if ((item = AuctionHouse.GetItem(RunningData.Instance.CurrentItemText.Trim())) != null) { CampahStatus.SetStatus("Looking up price for " + item.Name + "..."); this.Dispatcher.BeginInvoke(new ChangeTagDelegate(SetMaxBidTag), new object[] { true }); int sid; try { sid = FFACEInstance.Instance.Player.GetSID; } catch { CampahStatus.SetStatus("Unable to resolve player server, using default server. Requires FFACE v4.0.1.18"); sid = 0; } price = FFXIAH.LookupMedian(item.ID, sid + 1, (RunningData.Instance.CurrentItemStackable && item.Stackable), CampahStatus.Instance.WebTimeout); } if (price > -1) { if (_lastlookupitem.Key == item && _lastlookupitem.Value == RunningData.Instance.CurrentItemStackable) { Dispatcher.BeginInvoke(new ChangeMinIncDelegate(SetMinInc), new object[] { price }); } else { CampahStatus.SetStatus("Current median price for " + item.Name + " is " + price + "g."); Dispatcher.BeginInvoke(new ChangeMaxDelegate(SetMaxBid), new object[] { price }); } } _lastlookupitem = new KeyValuePair <AhItem, bool>(item, RunningData.Instance.CurrentItemStackable); Dispatcher.BeginInvoke(new ChangeTagDelegate(SetMaxBidTag), new object[] { false }); }
static CampahStatus() { Instance = new CampahStatus("", Modes.Stopped); }
public static int LookupMedian(int itemID, int serverID, bool stack, int timeout) { var item = FFXiAhItem.GetItemByID(itemID, stack); if (item.Price > -1) { return(item.Price); } var url = string.Format("http://www.ffxiah.com/item/{0}/?sid={1}&stack={2}", itemID, serverID, IsStack(stack)); var cookieContainer = new CookieContainer(); var serverCookie = new Cookie(); var serverCookie2 = new Cookie(); serverCookie.Name = "sid"; serverCookie2.Name = "sid"; serverCookie.Domain = "ffxiah.com"; serverCookie2.Domain = "www.ffxiah.com"; serverCookie.Value = serverID.ToString(CultureInfo.InvariantCulture); serverCookie2.Value = serverID.ToString(CultureInfo.InvariantCulture); cookieContainer.Add(serverCookie); cookieContainer.Add(serverCookie2); var webReq = (HttpWebRequest)WebRequest.Create(url); webReq.CookieContainer = cookieContainer; webReq.Timeout = timeout; webReq.ReadWriteTimeout = timeout; var buf = new byte[8192]; // execute the request WebResponse response; try { response = webReq.GetResponse(); } catch { CampahStatus.SetStatus("Price request timed out, try again"); return(-1); } // we will read data via the response stream Stream resStream = response.GetResponseStream(); string tempString; int count = 0; const string match = @".*<td>Median</td><td><span class=number-format>([0-9]*)</span></td>.*"; do { // fill the buffer with data if (resStream != null) { count = resStream.Read(buf, 0, buf.Length); } // make sure we read some data if (count != 0) { // translate from ASCII bytes to Unicode text tempString = Encoding.ASCII.GetString(buf, 0, count); // continue building the string var r = new Regex(match); Match found = r.Match(tempString); int median; if (int.TryParse(found.Groups[1].ToString(), out median)) { item.Price = median; return(median); } } } while (count > 0); // any more data to read? CampahStatus.SetStatus("Price request returned 0"); return(-1); }
private void BidOnItem(ItemRequest item) { if (FFACEInstance.Instance.Item.InventoryMax == FFACEInstance.Instance.Item.InventoryCount) { StopBuying("Inventory Full"); } if (item.BoughtCount >= item.Quantity) { return; } { string strstack = "."; if (item.Stack) { strstack = " stack."; } CampahStatus.Instance.Status = "Finding item: " + item.ItemData.Name + strstack; } if (!GotoMenu(item.ItemData.Address)) { GotoBidMenu(); return; } Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); int[] ids = ReadAHItems(); if (ids.Length < 3 || ids[0] == ids[2]) { //StopBuying("Error! AH item array could not be read. Try zoning or logging out"); CampahStatus.SetStatus("Error! AH item array could not be read. Try zoning or logging out\r\n\t\tSkipping to the next item."); return; } int index = Array.IndexOf(ids, item.ItemData.ID) + 1; int stack = 0; if (item.Stack && item.ItemData.Stackable) { stack = 1; } AuctionHouse.MenuIndex = index + stack; Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); int bid; { var parselowball = new Regex("[^0-9]*([0-9]+)(%)?.*"); Match matches = parselowball.Match(CampahStatus.Instance.LowballBid); int lowballamount; if (matches.Groups.Count > 1 && !string.IsNullOrEmpty(matches.Groups[1].Value) && int.TryParse(matches.Groups[1].Value, out lowballamount)) { //int lowballamount = int.Parse(matches.Groups[1].Value); if (matches.Groups[2].Value == "%" && lowballamount < 100) { bid = item.Minimum * lowballamount / 100; } else { bid = lowballamount; } if (bid > item.Minimum) { bid = item.Minimum; } } else { bid = item.Minimum; } } if (bid < 1) //safety check on bid { bid = 1; } bool firstbid = true; bool hasitems = false; Chatlog.Instance.ClearChatAlerts(); while (bid <= item.Maximum && item.BoughtCount < item.Quantity) { if (FFACEInstance.Instance.Item.InventoryMax == FFACEInstance.Instance.Item.InventoryCount) { StopBuying("Inventory Full"); } if (AuctionHouse.MenuIndex != index + stack) { CampahStatus.Instance.Status = "Error: Mismatch IDs, Skipping..."; break; } FFACEInstance.Instance.Windower.SendKeyPress(KeyCode.EnterKey); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); AuctionHouse.MenuIndex = 2; Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); FFACEInstance.Instance.Windower.SendKeyPress(KeyCode.EnterKey); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay * 2); if (!hasitems) { if (FFACEInstance.Instance.Menu.Selection != "Price Set") { CampahStatus.Instance.Status = item.ItemData.Name + " is unavailble on AH, Skipping..."; FFACEInstance.Instance.Windower.SendKeyPress(KeyCode.EscapeKey); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); break; } hasitems = true; } while (FFACEInstance.Instance.Menu.Selection != "Price Set") { Thread.Sleep(250); } AuctionHouse.BidValue = bid; CampahStatus.Instance.Status = string.Format("Bidding {0}g on {1}{2}", bid, item.ItemData.Name, item.Stack ? " stack." : "."); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); FFACEInstance.Instance.Windower.SendKeyPress(KeyCode.EnterKey); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); AuctionHouse.MenuIndex = 1; Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); var alert = new ChatAlert(new Regex(@".*You(.*)buy the .* for ([0-9,]*) gil\.")); Chatlog.Instance.AddAlert(alert); FFACEInstance.Instance.Windower.SendKeyPress(KeyCode.EnterKey); Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); FFACEInstance.Instance.Item.GetInventoryItemCount((ushort)item.ItemData.ID); var overrideAlert = false; int time = 0; while (!overrideAlert && !alert.Completed) { Thread.Sleep((int)CampahStatus.Instance.GlobalDelay); time += (int)CampahStatus.Instance.GlobalDelay; if (time >= 20000) { overrideAlert = true; } } if (overrideAlert) { CampahStatus.SetStatus("An error occurred while parsing bid results\r\n\t\tRemoving item from bid list"); item.BoughtCount = item.Quantity; break; } if (alert.Result.Groups[1].Value.Contains("unable")) { if (bid < item.Minimum) { bid = item.Minimum; } else { bid += item.Increment; } if (bid > item.Maximum && bid < (item.Maximum + item.Increment)) { bid = item.Maximum; } firstbid = false; if (bid <= item.Maximum) { CampahStatus.Instance.Status = "Bid rejected, increasing bid to " + bid + "g."; } else { CampahStatus.Instance.Status = "Bid rejected, skipping to the next item..."; } } else { var strstack = ""; if (item.Stack) { strstack = " stack"; } CampahStatus.Instance.Status = string.Format("You bought the {0}{1} for {2}g.", item.ItemData.Name, strstack, bid); item.BoughtCount++; item.BoughtCost += bid; RunningData.Instance.TotalSpent += bid; if (item.Minimum >= bid && firstbid && CampahStatus.Instance.CheapO) { bid -= item.Increment; if (bid < 1) { bid = 1; } } } Chatlog.Instance.ClearChatAlerts(); } }