/QuestorManager/Actions/BuyLPI.cs

https://github.com/SystemControl/Questor · C# · 264 lines · 174 code · 84 blank · 6 comment · 39 complexity · d684246bc8a6c8e1937798ec4d2a9778 MD5 · raw file

  1. namespace QuestorManager.Actions
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using DirectEve;
  8. using DirectEve = global::QuestorManager.Common.DirectEve;
  9. using global::QuestorManager.Common;
  10. using global::QuestorManager.Domains;
  11. using global::QuestorManager.Module;
  12. class BuyLPI
  13. {
  14. public StateBuyLPI State { get; set; }
  15. public int Item { get; set; }
  16. public int Unit { get; set; }
  17. private MainForm _form;
  18. private static DateTime _lastAction;
  19. private static DateTime _loyaltyPointTimeout;
  20. private static long _lastLoyaltyPoints;
  21. private int requiredUnit;
  22. private int requiredItemId;
  23. public BuyLPI(MainForm form1)
  24. {
  25. _form = form1;
  26. }
  27. public void ProcessState()
  28. {
  29. var hangar = DirectEve.Instance.GetItemHangar();
  30. var shiphangar = DirectEve.Instance.GetShipHangar();
  31. var lpstore = DirectEve.Instance.Windows.OfType<DirectLoyaltyPointStoreWindow>().FirstOrDefault();
  32. var marketWindow = DirectEve.Instance.Windows.OfType<DirectMarketWindow>().FirstOrDefault();
  33. if (DateTime.Now.Subtract(_lastAction).TotalSeconds < 2)
  34. return;
  35. _lastAction = DateTime.Now;
  36. switch (State)
  37. {
  38. case StateBuyLPI.Idle:
  39. case StateBuyLPI.Done:
  40. break;
  41. case StateBuyLPI.Begin:
  42. if (marketWindow != null)
  43. marketWindow.Close();
  44. if (lpstore != null)
  45. lpstore.Close();
  46. State = StateBuyLPI.OpenItemHangar;
  47. break;
  48. case StateBuyLPI.OpenItemHangar:
  49. if (!hangar.IsReady)
  50. {
  51. DirectEve.Instance.ExecuteCommand(DirectCmd.OpenHangarFloor);
  52. Logging.Log("BuyLPI: Opening item hangar");
  53. }
  54. State = StateBuyLPI.OpenLpStore;
  55. break;
  56. case StateBuyLPI.OpenLpStore:
  57. if (lpstore == null)
  58. {
  59. DirectEve.Instance.ExecuteCommand(DirectCmd.OpenLpstore);
  60. Logging.Log("BuyLPI: Opening loyalty point store");
  61. }
  62. State = StateBuyLPI.FindOffer;
  63. break;
  64. case StateBuyLPI.FindOffer:
  65. var offer = lpstore.Offers.FirstOrDefault(o => o.TypeId == Item);
  66. // Wait for the amount of LP to change
  67. if (_lastLoyaltyPoints == lpstore.LoyaltyPoints)
  68. break;
  69. // Do not expect it to be 0 (probably means its reloading)
  70. if (lpstore.LoyaltyPoints == 0)
  71. {
  72. if (_loyaltyPointTimeout < DateTime.Now)
  73. {
  74. Logging.Log("BuyLPI: It seems we have no loyalty points left");
  75. State = StateBuyLPI.Done;
  76. }
  77. break;
  78. }
  79. _lastLoyaltyPoints = lpstore.LoyaltyPoints;
  80. // Find the offer
  81. if (offer == null)
  82. {
  83. Logging.Log("BuyLPI: Can't find offer with type name/id: {0}!", Item);
  84. State = StateBuyLPI.Done;
  85. break;
  86. }
  87. State = StateBuyLPI.CheckPetition;
  88. break;
  89. case StateBuyLPI.CheckPetition:
  90. var offer1 = lpstore.Offers.FirstOrDefault(o => o.TypeId == Item);
  91. // Check LP
  92. if (_lastLoyaltyPoints < offer1.LoyaltyPointCost)
  93. {
  94. Logging.Log("BuyLPI: Not enough loyalty points left");
  95. State = StateBuyLPI.Done;
  96. break;
  97. }
  98. // Check ISK
  99. if (DirectEve.Instance.Me.Wealth < offer1.IskCost)
  100. {
  101. Logging.Log("BuyLPI: Not enough ISK left");
  102. State = StateBuyLPI.Done;
  103. break;
  104. }
  105. // Check items
  106. foreach (var requiredItem in offer1.RequiredItems)
  107. {
  108. var ship = shiphangar.Items.FirstOrDefault(i => i.TypeId == requiredItem.TypeId);
  109. var item = hangar.Items.FirstOrDefault(i => i.TypeId == requiredItem.TypeId);
  110. if (item == null || item.Quantity < requiredItem.Quantity)
  111. {
  112. if (ship == null || ship.Quantity < requiredItem.Quantity)
  113. {
  114. Logging.Log("BuyLPI: Missing {0}x {1}", requiredItem.Quantity, requiredItem.TypeName);
  115. if (!_form.chkBuyItems.Checked)
  116. {
  117. Logging.Log("BuyLPI: Done, do not buy item");
  118. State = StateBuyLPI.Done;
  119. break;
  120. }
  121. Logging.Log("BuyLPI: Are buying the item " + requiredItem.TypeName);
  122. requiredUnit = Convert.ToInt32(requiredItem.Quantity);
  123. requiredItemId = requiredItem.TypeId;
  124. State = StateBuyLPI.OpenMarket;
  125. return;
  126. }
  127. }
  128. }
  129. State = StateBuyLPI.AcceptOffer;
  130. break;
  131. case StateBuyLPI.OpenMarket:
  132. if (marketWindow == null)
  133. {
  134. DirectEve.Instance.ExecuteCommand(DirectCmd.OpenMarket);
  135. break;
  136. }
  137. if (!marketWindow.IsReady)
  138. break;
  139. State = StateBuyLPI.BuyItems;
  140. break;
  141. case StateBuyLPI.BuyItems:
  142. Logging.Log("BuyLPI: Opening Market");
  143. if (marketWindow.DetailTypeId != requiredItemId)
  144. {
  145. marketWindow.LoadTypeId(requiredItemId);
  146. break;
  147. }
  148. var orders = marketWindow.SellOrders.Where(o => o.StationId == DirectEve.Instance.Session.StationId);
  149. var order = orders.OrderBy(o => o.Price).FirstOrDefault();
  150. if (order == null)
  151. {
  152. Logging.Log("BuyLPI: No orders");
  153. State = StateBuyLPI.Done;
  154. break;
  155. }
  156. order.Buy(requiredUnit, DirectOrderRange.Station);
  157. Logging.Log("BuyLPI: Buy Item");
  158. State = StateBuyLPI.CheckPetition;
  159. break;
  160. case StateBuyLPI.AcceptOffer:
  161. var offer2 = lpstore.Offers.FirstOrDefault(o => o.TypeId == Item);
  162. Logging.Log("BuyLPI: Accepting {0}", offer2.TypeName);
  163. offer2.AcceptOffer();
  164. State = StateBuyLPI.Quatity;
  165. break;
  166. case StateBuyLPI.Quatity:
  167. _loyaltyPointTimeout = DateTime.Now.AddSeconds(10);
  168. Unit = Unit - 1;
  169. if (Unit <= 0)
  170. {
  171. Logging.Log("BuyLPI: Quantity limit reached");
  172. State = StateBuyLPI.Done;
  173. break;
  174. }
  175. State = StateBuyLPI.Begin;
  176. break;
  177. }
  178. }
  179. }
  180. }