Advertisement
Guest User

Untitled

a guest
Jan 10th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.54 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.IO;
  5. using CSharpTradeOffers.Configuration;
  6. using CSharpTradeOffers.Trading;
  7. using CSharpTradeOffers.Web;
  8. using Newtonsoft.Json;
  9. using SteamAuth;
  10. using System.Data.SqlClient;
  11. using System.Data;
  12. using System.Xml;
  13. using System.Linq;
  14.  
  15. namespace TradeBot
  16. {
  17. class Program
  18. {
  19. static SqlConnection connection;
  20. static string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\FirewareStudios\Development\TradeBots\Database\Database.mdf;Integrated Security=True; MultipleActiveResultSets=True; pooling=true;";
  21.  
  22. static Account account;
  23. static DefaultConfig config = new DefaultConfig();
  24. static readonly XmlConfigHandler configHandler = new XmlConfigHandler("configuration.xml");
  25. static readonly Web Web = new Web(new SteamWebRequestHandler());
  26. static readonly MarketHandler MarketHandler = new MarketHandler();
  27.  
  28. static Web web = new Web(new SteamWebRequestHandler());
  29.  
  30. static List<InventoryID> botItems = new List<InventoryID>();
  31. static List<InventoryID> userItems = new List<InventoryID>();
  32.  
  33. static void Main()
  34. {
  35. Console.OutputEncoding = System.Text.Encoding.UTF8;
  36. Console.Title = "Trade Bot 2.0";
  37. var sgAccount = JsonConvert.DeserializeObject<SteamGuardAccount>(File.ReadAllText("account.maFile"));
  38. string sgCode = sgAccount.GenerateSteamGuardCode();
  39. Login(sgCode);
  40. var marketHandler = new MarketHandler();
  41. marketHandler.EligibilityCheck(account.SteamId, account.AuthContainer);
  42. sgAccount.Session.SteamLogin = account.FindCookieByName("steamlogin").Value;
  43. sgAccount.Session.SteamLoginSecure = account.FindCookieByName("steamloginsecure").Value;
  44. connection = new SqlConnection(connectionString);
  45.  
  46. while (true)
  47. {
  48. if (connection.State == ConnectionState.Open)
  49. {
  50. connection.Close();
  51. }
  52. connection.Open();
  53. /*try
  54. {*/
  55. Console.WriteLine(sgAccount.GenerateSteamGuardCode());
  56. UpdateTradeLogs();
  57. /*Thread SendThread = new Thread(SendOffers);
  58. Thread ReceiveThread = new Thread(ReceiveOffers);
  59. SendThread.Start();
  60. ReceiveThread.Start();*/
  61. SendOffers();
  62. ReceiveOffers();
  63. AcceptConfirmations(sgAccount);
  64. /*while (SendThread.IsAlive == true || ReceiveThread.IsAlive == true)
  65. {
  66. Thread.Sleep(500);
  67. }*/
  68. UpdateTradeLogs();
  69. if (connection.State == ConnectionState.Open)
  70. {
  71. connection.Close();
  72. }
  73. Thread.Sleep(60000);
  74. /* }
  75. catch (Exception e)
  76. {
  77. Console.WriteLine(e.Message);
  78. }*/
  79. }
  80. }
  81.  
  82. static void Login(string sgCode)
  83. {
  84. config = configHandler.Reload();
  85. if (string.IsNullOrEmpty(config.Username) || string.IsNullOrEmpty(config.Password)) {
  86. Console.Write("Username: ");
  87. config.Username = Console.ReadLine();
  88. Console.Write("Password: ");
  89. config.Password = Console.ReadLine();
  90. configHandler.WriteChanges(config);
  91. }
  92. if (string.IsNullOrEmpty(config.ApiKey)) {
  93. Console.Write("APIKey: ");
  94. config.ApiKey = Console.ReadLine();
  95. configHandler.WriteChanges(config);
  96. }
  97. Console.WriteLine("Logging to Steam...");
  98. account = Web.RetryDoLogin(TimeSpan.FromSeconds(10), 10, config.Username, config.Password, sgCode, config.SteamMachineAuth);
  99. if (string.IsNullOrEmpty(config.SteamMachineAuth)) {
  100. config.SteamMachineAuth = account.SteamMachineAuth;
  101. configHandler.WriteChanges(config);
  102. }
  103. Console.WriteLine("Login Successful!");
  104. }
  105.  
  106. static void SendOffers()
  107. {
  108. var offerHandler = new EconServiceHandler(config.ApiKey);
  109. XmlDocument xmlDoc = new XmlDocument();
  110. xmlDoc.Load("http://steamcommunity.com/groups/trade_botz/memberslistxml/list.xml?xml=1");
  111. string query1 = "UPDATE Users SET Member = '0'";
  112. SqlCommand command1 = new SqlCommand(query1, connection);
  113. command1.ExecuteNonQuery();
  114. foreach (XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[6].ChildNodes)
  115. {
  116. string query2 = "SELECT * FROM Users WHERE SteamID64 = '" + xmlNode.InnerText + "'";
  117. SqlDataAdapter adapter2 = new SqlDataAdapter(query2, connection);
  118. DataTable dataTable2 = new DataTable();
  119. adapter2.Fill(dataTable2);
  120. if (dataTable2.Rows.Count == 0)
  121. {
  122. string query3 = "INSERT INTO Users (SteamID64) VALUES ('" + xmlNode.InnerText + "')";
  123. SqlCommand command3 = new SqlCommand(query3, connection);
  124. command3.ExecuteNonQuery();
  125. }
  126. string query4 = "UPDATE Users SET Member = '1' WHERE SteamID64 = '" + xmlNode.InnerText + "'";
  127. SqlCommand command4 = new SqlCommand(query4, connection);
  128. command4.ExecuteNonQuery();
  129. }
  130. string query5 = "SELECT TOP 1 * FROM Users WHERE SendOffers='1' AND Member='1' ORDER BY OffersLastDay ASC";
  131. SqlDataAdapter adapter5 = new SqlDataAdapter(query5, connection);
  132. DataTable dataTable5 = new DataTable();
  133. adapter5.Fill(dataTable5);
  134. foreach (DataRow dataRow5 in dataTable5.Rows)
  135. {
  136. Inventory botInventory = new Inventory(account.SteamId, 730);
  137. Inventory userInventory = new Inventory((ulong)Convert.ToInt64(dataRow5["SteamID64"]), 730);
  138. List<int> botIDs = new List<int>();
  139. List<int> userIDs = new List<int>();
  140. List<ItemSet> userItemSetList = new List<ItemSet>();
  141. List<ItemSet> botItemSetList = new List<ItemSet>();
  142. List<OfferSample> offerSampleList = new List<OfferSample>();
  143. string tradeOfferID;
  144. int botID = 0;
  145. int userID = 0;
  146. Console.WriteLine(dataRow5["SteamID64"]);
  147. foreach (Item item in botInventory.Items.Values)
  148. {
  149. if (item.Description.Tradable == true)
  150. {
  151. foreach (RgInventoryItem rgItem in item.Items)
  152. {
  153. InventoryID id = new InventoryID();
  154. CEconAsset asset = new CEconAsset();
  155. asset = rgItem.ToCEconAsset(730);
  156. asset.MarketHashName = item.Description.MarketHashName;
  157. id.Asset = asset;
  158. id.ID = botID;
  159. botItems.Add(id);
  160. botIDs.Add(botID);
  161. botID++;
  162. }
  163. Console.WriteLine(item.Description.MarketHashName);
  164. }
  165. }
  166. foreach (Item item in userInventory.Items.Values)
  167. {
  168. if (item.Description.Tradable == true)
  169. {
  170. foreach (RgInventoryItem rgItem in item.Items)
  171. {
  172. InventoryID id = new InventoryID();
  173. CEconAsset asset = new CEconAsset();
  174. asset = rgItem.ToCEconAsset(730);
  175. asset.MarketHashName = item.Description.MarketHashName;
  176. id.Asset = asset;
  177. id.ID = userID;
  178. userItems.Add(id);
  179. userIDs.Add(userID);
  180. userID++;
  181. }
  182. Console.WriteLine(item.Description.MarketHashName);
  183. }
  184. }
  185. int subsetsuser = 0;
  186. int subsetsbot = 0;
  187. foreach (Array array in CreateSubsets(botIDs.ToArray()))
  188. {
  189. ItemSet itemSet = new ItemSet();
  190. itemSet.Assets = ((int[])array).ToList();
  191. if (itemSet.Assets.Count <= 3)
  192. {
  193. List<CEconAsset> assets = new List<CEconAsset>();
  194. foreach (int a in itemSet.Assets)
  195. {
  196. assets.Add(IDToAssetBot(a));
  197. }
  198. itemSet.Price = GetAssetTotal(assets);
  199. itemSet.Volume = GetTotalVolume(assets);
  200. botItemSetList.Add(itemSet);
  201. subsetsbot++;
  202. }
  203. }
  204. foreach (Array array in CreateSubsets(UserItemsSorted(userIDs).ToArray()))
  205. {
  206. ItemSet itemSet = new ItemSet();
  207. itemSet.Assets = ((int[])array).ToList();
  208. if (itemSet.Assets.Count <= 3)
  209. {
  210. List<CEconAsset> assets = new List<CEconAsset>();
  211. foreach (int a in itemSet.Assets)
  212. {
  213. assets.Add(IDToAssetUser(a));
  214. }
  215. itemSet.Price = GetAssetTotal(assets);
  216. itemSet.Volume = GetTotalVolume(assets);
  217. userItemSetList.Add(itemSet);
  218. subsetsuser++;
  219. }
  220. }
  221. foreach (ItemSet botItemSet in botItemSetList)
  222. {
  223. foreach (ItemSet userItemSet in userItemSetList)
  224. {
  225. if ((userItemSet.Price > (botItemSet.Price * 1.05m)) && (userItemSet.Price < (botItemSet.Price * 1.15m)))
  226. {
  227. string setUserItem0 = null;
  228. string setUserItem1 = null;
  229. string setUserItem2 = null;
  230. string setUserItem3 = null;
  231. string setUserItem4 = null;
  232. string setBotItem0 = null;
  233. string setBotItem1 = null;
  234. string setBotItem2 = null;
  235. string setBotItem3 = null;
  236. string setBotItem4 = null;
  237. if (userItemSet.Assets.Count > 0) setUserItem0 = IDToAssetUser(userItemSet.Assets.ElementAt(0)).MarketHashName;
  238. if (userItemSet.Assets.Count > 1) setUserItem1 = IDToAssetUser(userItemSet.Assets.ElementAt(1)).MarketHashName;
  239. if (userItemSet.Assets.Count > 2) setUserItem2 = IDToAssetUser(userItemSet.Assets.ElementAt(2)).MarketHashName;
  240. if (userItemSet.Assets.Count > 3) setUserItem3 = IDToAssetUser(userItemSet.Assets.ElementAt(3)).MarketHashName;
  241. if (userItemSet.Assets.Count > 4) setUserItem4 = IDToAssetUser(userItemSet.Assets.ElementAt(4)).MarketHashName;
  242. if (botItemSet.Assets.Count > 0) setBotItem0 = IDToAssetBot(botItemSet.Assets.ElementAt(0)).MarketHashName;
  243. if (botItemSet.Assets.Count > 1) setBotItem1 = IDToAssetBot(botItemSet.Assets.ElementAt(1)).MarketHashName;
  244. if (botItemSet.Assets.Count > 2) setBotItem2 = IDToAssetBot(botItemSet.Assets.ElementAt(2)).MarketHashName;
  245. if (botItemSet.Assets.Count > 3) setBotItem3 = IDToAssetBot(botItemSet.Assets.ElementAt(3)).MarketHashName;
  246. if (botItemSet.Assets.Count > 4) setBotItem4 = IDToAssetBot(botItemSet.Assets.ElementAt(4)).MarketHashName;
  247. string query7 = "SELECT * FROM TradeLogs WHERE SteamID64 = '" + dataRow5["SteamID64"] + "' AND UserItem0 = '" + setUserItem0 + "' AND UserItem1 = '" + setUserItem1 + "' AND UserItem2 = '" + setUserItem2 + "' AND UserItem3 = '" + setUserItem3 + "' AND UserItem4 = '" + setUserItem4 + "' AND BotItem0 = '" + setBotItem0 + "' AND BotItem1 = '" + setBotItem1 + "' AND BotItem2 = '" + setBotItem2 + "' AND BotItem3 = '" + setBotItem3 + "' AND BotItem4 = '" + setBotItem4 + "'";
  248. SqlDataAdapter adapter7 = new SqlDataAdapter(query7, connection);
  249. DataTable dataTable7 = new DataTable();
  250. adapter7.Fill(dataTable7);
  251. if (dataTable7.Rows.Count == 0)
  252. {
  253. OfferSample offerSample = new OfferSample();
  254. offerSample.BotItems = botItemSet.Assets;
  255. offerSample.UserItems = userItemSet.Assets;
  256. double avgItemPrice = (double)userItemSet.Price / (double)userItemSet.Assets.Count;
  257. //TODO: REWORK
  258. double itemRank = avgItemPrice * avgItemPrice * avgItemPrice / ((double)userItemSet.Volume / (double)userItemSet.Assets.Count) / (double)botItemSet.Volume * (double)botItemSet.Assets.Count;
  259. offerSample.Rank = itemRank;
  260. offerSampleList.Add(offerSample);
  261. }
  262. }
  263. }
  264. }
  265. Console.WriteLine(offerSampleList.Count.ToString());
  266. if (offerSampleList.Count > 0)
  267. {
  268. OfferSample bestOfferSample = new OfferSample();
  269. double bestOfferRank = 0f;
  270. foreach (OfferSample offerSample in offerSampleList)
  271. {
  272. if (offerSample.Rank > bestOfferRank)
  273. {
  274. bestOfferSample = offerSample;
  275. bestOfferRank = offerSample.Rank;
  276. Console.WriteLine("New best rank is: " + bestOfferRank.ToString());
  277. }
  278. }
  279. TradeOffer offer = new TradeOffer();
  280. List<CEconAsset> userAssets = new List<CEconAsset>();
  281. List<CEconAsset> botAssets = new List<CEconAsset>();
  282. foreach (int b in bestOfferSample.UserItems)
  283. {
  284. userAssets.Add(IDToAssetUser(b));
  285. }
  286. foreach (int b in bestOfferSample.BotItems)
  287. {
  288. botAssets.Add(IDToAssetBot(b));
  289. }
  290. foreach (CEconAsset asset in userAssets)
  291. {
  292. offer.Them.Assets.Add(asset);
  293. }
  294. foreach (CEconAsset asset in botAssets)
  295. {
  296. offer.Me.Assets.Add(asset);
  297. }
  298. string userItem0 = null;
  299. string userItem1 = null;
  300. string userItem2 = null;
  301. string userItem3 = null;
  302. string userItem4 = null;
  303. string botItem0 = null;
  304. string botItem1 = null;
  305. string botItem2 = null;
  306. string botItem3 = null;
  307. string botItem4 = null;
  308. if (offer.Them.Assets.Count > 0) userItem0 = offer.Them.Assets.ElementAt(0).MarketHashName;
  309. if (offer.Them.Assets.Count > 1) userItem1 = offer.Them.Assets.ElementAt(1).MarketHashName;
  310. if (offer.Them.Assets.Count > 2) userItem2 = offer.Them.Assets.ElementAt(2).MarketHashName;
  311. if (offer.Them.Assets.Count > 3) userItem3 = offer.Them.Assets.ElementAt(3).MarketHashName;
  312. if (offer.Them.Assets.Count > 4) userItem4 = offer.Them.Assets.ElementAt(4).MarketHashName;
  313. if (offer.Me.Assets.Count > 0) botItem0 = offer.Me.Assets.ElementAt(0).MarketHashName;
  314. if (offer.Me.Assets.Count > 1) botItem1 = offer.Me.Assets.ElementAt(1).MarketHashName;
  315. if (offer.Me.Assets.Count > 2) botItem2 = offer.Me.Assets.ElementAt(2).MarketHashName;
  316. if (offer.Me.Assets.Count > 3) botItem3 = offer.Me.Assets.ElementAt(3).MarketHashName;
  317. if (offer.Me.Assets.Count > 4) botItem4 = offer.Me.Assets.ElementAt(4).MarketHashName;
  318. Console.WriteLine(offer.Me.Assets.Count.ToString() + " for " + offer.Them.Assets.Count.ToString());
  319. tradeOfferID = offerHandler.SendTradeOffer((ulong)Convert.ToInt64(dataRow5["SteamID64"]), offer.Me.Assets.Count.ToString() + " for " + offer.Them.Assets.Count.ToString(), "1", offer, account.AuthContainer).TradeOfferId;
  320. Console.WriteLine("offer sent!");
  321. string query6 = "INSERT INTO TradeLogs VALUES ('" + dataRow5["SteamID64"].ToString() + "', '" + UnixTime().ToString() + "', '" + tradeOfferID + "', '" + userItem0 + "', '" + userItem1 + "', '" + userItem2 + "', '" + userItem3 + "', '" + userItem4 + "', '" + botItem0 + "', '" + botItem1 + "', '" + botItem2 + "', '" + botItem3 + "', '" + botItem4 + "')";
  322. SqlCommand command6 = new SqlCommand(query6, connection);
  323. command6.ExecuteNonQuery();
  324. }
  325. else
  326. {
  327. Console.WriteLine("No offers for this user: " + dataRow5["SteamID64"].ToString());
  328. string query6 = "INSERT INTO TradeLogs (SteamID64, Time) VALUES ('" + dataRow5["SteamID64"].ToString() + "', '" + UnixTime().ToString() + "')";
  329. SqlCommand command6 = new SqlCommand(query6, connection);
  330. command6.ExecuteNonQuery();
  331. }
  332. botItemSetList.Clear();
  333. userItemSetList.Clear();
  334. botItems.Clear();
  335. userItems.Clear();
  336. }
  337. }
  338.  
  339. static void ReceiveOffers()
  340. {
  341. var offerHandler = new EconServiceHandler(config.ApiKey);
  342. var recData = new Dictionary<string, string>
  343. {
  344. {"get_received_offers", "1"},
  345. {"active_only", "1"}
  346. };
  347. var offers = offerHandler.GetTradeOffers(recData).TradeOffersReceived;
  348. if (offers == null)
  349. {
  350. Console.WriteLine(DateTime.Now.ToString() + " - No new offers!");
  351. }
  352. else
  353. {
  354. Console.WriteLine(DateTime.Now.ToString() + " - " + offers.Count + " new offers. ");
  355. foreach (CEconTradeOffer cEconTradeOffer in offers)
  356. {
  357. foreach (CEconAsset asset in cEconTradeOffer.ItemsToGive)
  358. {
  359. asset.MarketHashName = asset.GetMarketHashName(config.ApiKey);
  360. }
  361. foreach (CEconAsset asset in cEconTradeOffer.ItemsToReceive)
  362. {
  363. asset.MarketHashName = asset.GetMarketHashName(config.ApiKey);
  364. }
  365.  
  366. if (GetAssetTotal(cEconTradeOffer.ItemsToReceive) > GetAssetTotal(cEconTradeOffer.ItemsToGive))
  367. {
  368. offerHandler.AcceptTradeOffer(cEconTradeOffer.TradeOfferId, cEconTradeOffer.AccountIdOther, account.AuthContainer, "1");
  369. }
  370. else
  371. {
  372. offerHandler.DeclineTradeOffer(cEconTradeOffer.TradeOfferId);
  373. }
  374. }
  375. }
  376. }
  377.  
  378. static void UpdateTradeLogs()
  379. {
  380. var offerHandler = new EconServiceHandler(config.ApiKey);
  381. var recData = new Dictionary<string, string>
  382. {
  383. {"get_sent_offers", "1"},
  384. {"historical_only", "1"}
  385. };
  386. var offers = offerHandler.GetTradeOffers(recData).TradeOffersSent;
  387. if (offers != null)
  388. {
  389. foreach (CEconTradeOffer cEconTradeOffer in offers)
  390. {
  391. if (cEconTradeOffer.TradeOfferState == 3 || cEconTradeOffer.TradeOfferState == 8)
  392. {
  393. string queryUT0 = "DELETE FROM TradeLogs WHERE TradeOfferID = '" + cEconTradeOffer.TradeOfferId + "'";
  394. SqlCommand commandUT0 = new SqlCommand(queryUT0, connection);
  395. commandUT0.ExecuteNonQuery();
  396. }
  397. }
  398. }
  399. string queryUT1 = "DELETE FROM TradeLogs WHERE Time + 2592000 < " + UnixTime().ToString();
  400. SqlCommand commandUT1 = new SqlCommand(queryUT1, connection);
  401. commandUT1.ExecuteNonQuery();
  402. string queryUT2 = "SELECT * FROM Users";
  403. SqlDataAdapter adapterUT2 = new SqlDataAdapter(queryUT2, connection);
  404. DataTable dataTableUT2 = new DataTable();
  405. adapterUT2.Fill(dataTableUT2);
  406. foreach (DataRow dataRowUT2 in dataTableUT2.Rows)
  407. {
  408. int offersLastDay = 0;
  409. string queryUT3 = "SELECT SteamID64,Time FROM TradeLogs WHERE SteamID64 = '" + dataRowUT2["SteamID64"].ToString() + "' AND Time + 86400 > " + UnixTime().ToString();
  410. SqlDataAdapter adapterUT3 = new SqlDataAdapter(queryUT3, connection);
  411. DataTable dataTableUT3 = new DataTable();
  412. adapterUT3.Fill(dataTableUT3);
  413. foreach (DataRow dataRowUT3 in dataTableUT3.Rows)
  414. {
  415. offersLastDay++;
  416. }
  417. string queryUT4 = "UPDATE Users SET OffersLastDay = '" + offersLastDay.ToString() + "' WHERE SteamID64 = '" + dataRowUT2["SteamID64"].ToString() + "'";
  418. SqlCommand commandUT4 = new SqlCommand(queryUT4, connection);
  419. commandUT4.ExecuteNonQuery();
  420. }
  421. }
  422.  
  423. static void AcceptConfirmations(SteamGuardAccount sgAccount)
  424. {
  425. if (sgAccount.FetchConfirmations().Length == 0)
  426. {
  427. Console.WriteLine("Nothing to confirm.");
  428. }
  429. else
  430. {
  431. foreach (Confirmation confirmation in sgAccount.FetchConfirmations())
  432. {
  433. sgAccount.AcceptConfirmation(confirmation);
  434. Console.WriteLine("Confirmed " + confirmation.ID.ToString());
  435. }
  436. }
  437. }
  438.  
  439. static decimal GetAssetTotal(List<CEconAsset> assets)
  440. {
  441. decimal t = decimal.Zero;
  442. foreach (CEconAsset asset in assets)
  443. {
  444. t = t + GetAssetPrice(asset);
  445. }
  446. return t;
  447. }
  448.  
  449. static decimal GetAssetPrice(CEconAsset asset)
  450. {
  451. decimal t = decimal.Zero;
  452. if (asset.MarketHashName == "")
  453. {
  454. asset.MarketHashName = asset.GetMarketHashName(config.ApiKey);
  455. }
  456. string queryGAP = "SELECT TOP 1 * FROM ItemPrices WHERE MarketHashName = @item";
  457. SqlDataAdapter adapterGAP = new SqlDataAdapter(queryGAP, connection);
  458. adapterGAP.SelectCommand.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  459. DataTable dataTableGAP = new DataTable();
  460. adapterGAP.Fill(dataTableGAP);
  461. if (dataTableGAP.Rows.Count == 0)
  462. {
  463. queryGAP = "INSERT INTO ItemPrices (MarketHashName) VALUES (@item)";
  464. SqlCommand commandGAP = new SqlCommand(queryGAP, connection);
  465. commandGAP.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  466. commandGAP.ExecuteNonQuery();
  467. Thread.Sleep(1000);
  468. t = GetAssetPrice(asset);
  469. }
  470. else
  471. {
  472. foreach (DataRow dataRowGAP in dataTableGAP.Rows)
  473. {
  474. if (dataRowGAP["LastChecked"].ToString() == "0")
  475. {
  476. Thread.Sleep(1000);
  477. t = GetAssetPrice(asset);
  478. }
  479. else if (dataRowGAP["Price"].ToString() == "")
  480. {
  481. Console.WriteLine(dataRowGAP["MarketHashName"].ToString() + " - item not found");
  482. }
  483. else
  484. {
  485. t = Convert.ToDecimal(dataRowGAP["Price"].ToString());
  486. }
  487. }
  488. }
  489. return t;
  490. }
  491.  
  492. static int GetTotalVolume(List<CEconAsset> assets)
  493. {
  494. int v = 0;
  495. foreach (CEconAsset asset in assets)
  496. {
  497. v = v + GetAssetVolume(asset);
  498. }
  499. return v;
  500. }
  501.  
  502. static int GetAssetVolume(CEconAsset asset)
  503. {
  504. int v = 0;
  505. if (asset.MarketHashName == "")
  506. {
  507. asset.MarketHashName = asset.GetMarketHashName(config.ApiKey);
  508. }
  509. string queryGTV = "SELECT TOP 1 * FROM ItemPrices WHERE MarketHashName = @item";
  510. SqlDataAdapter adapterGTV = new SqlDataAdapter(queryGTV, connection);
  511. adapterGTV.SelectCommand.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  512. DataTable dataTableGTV = new DataTable();
  513. adapterGTV.Fill(dataTableGTV);
  514. if (dataTableGTV.Rows.Count == 0)
  515. {
  516. Console.WriteLine(asset.MarketHashName);
  517. queryGTV = "INSERT INTO ItemPrices (MarketHashName) VALUES (@item)";
  518. SqlCommand commandGTV = new SqlCommand(queryGTV, connection);
  519. commandGTV.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  520. commandGTV.ExecuteNonQuery();
  521. Thread.Sleep(1000);
  522. v = GetAssetVolume(asset);
  523. }
  524. else
  525. {
  526. foreach (DataRow dataRowGTV in dataTableGTV.Rows)
  527. {
  528. if (dataRowGTV["LastChecked"].ToString() == "0")
  529. {
  530. Thread.Sleep(1000);
  531. v = GetAssetVolume(asset);
  532. }
  533. else
  534. {
  535. v = Convert.ToInt32(dataRowGTV["Volume"].ToString());
  536. }
  537. }
  538. }
  539. return v;
  540. }
  541.  
  542. static List<int> UserItemsSorted(List<int> ids)
  543. {
  544. List<int> progress = new List<int>();
  545. List<CEconAsset> assets = new List<CEconAsset>();
  546. foreach (int id in ids)
  547. {
  548. assets.Add(IDToAssetUser(id));
  549. }
  550. foreach (CEconAsset asset in assets)
  551. {
  552. if (CompatibleAsset(asset) == true)
  553. {
  554. progress.Add(AssetToIDUser(asset));
  555. }
  556. }
  557. return progress;
  558. }
  559.  
  560. static bool CompatibleAsset (CEconAsset asset)
  561. {
  562. bool c = true;
  563. string queryC = "SELECT TOP 1 * FROM ItemPrices WHERE MarketHashName = @item";
  564. SqlDataAdapter adapterC = new SqlDataAdapter(queryC, connection);
  565. adapterC.SelectCommand.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  566. DataTable dataTableC = new DataTable();
  567. adapterC.Fill(dataTableC);
  568. if (dataTableC.Rows.Count == 0)
  569. {
  570. string queryCa = "INSERT INTO ItemPrices (MarketHashName) VALUES (@item)";
  571. SqlCommand commandCa = new SqlCommand(queryCa, connection);
  572. commandCa.Parameters.Add("@item", SqlDbType.NVarChar).Value = asset.MarketHashName;
  573. commandCa.ExecuteNonQuery();
  574. Thread.Sleep(1000);
  575. c = CompatibleAsset(asset);
  576. }
  577. else
  578. {
  579. foreach (DataRow dataRowC in dataTableC.Rows)
  580. {
  581. if (dataRowC["MarketHashName"].ToString().EndsWith("Case")) c = false;
  582. if (dataRowC["MarketHashName"].ToString().StartsWith("Souvenir")) c = false;
  583. if (dataRowC["LastChecked"].ToString() == "0")
  584. {
  585. Thread.Sleep(1000);
  586. c = CompatibleAsset(asset);
  587. }
  588. else
  589. {
  590. if (dataRowC["Price"].ToString() == "")
  591. {
  592. c = false;
  593. }
  594. else if (Convert.ToDecimal(dataRowC["Price"].ToString()) < 0.03m)
  595. {
  596. c = false;
  597. }
  598. if (dataRowC["MarketHashName"].ToString().StartsWith("StatTrak") && Convert.ToDecimal(dataRowC["Price"].ToString()) < 200m)
  599. {
  600. c = false;
  601. }
  602. if (Convert.ToInt32(dataRowC["Volume"].ToString()) < 15)
  603. {
  604. c = false;
  605. }
  606. if (dataRowC["FirstSeen"].ToString() == "")
  607. {
  608. c = false;
  609. }
  610. else if (Convert.ToInt32(dataRowC["FirstSeen"].ToString()) + 1209600 > UnixTime())
  611. {
  612. c = false;
  613. }
  614. }
  615. }
  616. }
  617. return c;
  618. }
  619.  
  620. static CEconAsset IDToAssetUser (int i)
  621. {
  622. CEconAsset asset = new CEconAsset();
  623. foreach (InventoryID invID in userItems)
  624. {
  625. if (i == invID.ID) asset = invID.Asset;
  626. }
  627. return asset;
  628. }
  629.  
  630. static CEconAsset IDToAssetBot (int i)
  631. {
  632. CEconAsset asset = new CEconAsset();
  633. foreach (InventoryID invID in botItems)
  634. {
  635. if (i == invID.ID) asset = invID.Asset;
  636. }
  637. return asset;
  638. }
  639.  
  640. static int AssetToIDUser (CEconAsset asset)
  641. {
  642. int id = 0;
  643. foreach (InventoryID invID in userItems)
  644. {
  645. if (asset == invID.Asset) id = invID.ID;
  646. }
  647. return id;
  648. }
  649.  
  650. static int AssetToIDBot(CEconAsset asset)
  651. {
  652. int id = 0;
  653. foreach (InventoryID invID in botItems)
  654. {
  655. if (asset == invID.Asset) id = invID.ID;
  656. }
  657. return id;
  658. }
  659.  
  660. static int UnixTime()
  661. {
  662. int unixTimestamp;
  663. unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
  664. return unixTimestamp;
  665. }
  666.  
  667. static List<T[]> CreateSubsets<T>(T[] originalArray)
  668. {
  669. List<T[]> subsets = new List<T[]>();
  670.  
  671. for (int i = 0; i < originalArray.Length; i++)
  672. {
  673. int subsetCount = subsets.Count;
  674. subsets.Add(new T[] { originalArray[i] });
  675.  
  676. for (int j = 0; j < subsetCount; j++)
  677. {
  678. T[] newSubset = new T[subsets[j].Length + 1];
  679. subsets[j].CopyTo(newSubset, 0);
  680. newSubset[newSubset.Length - 1] = originalArray[i];
  681. subsets.Add(newSubset);
  682. }
  683. }
  684. return subsets;
  685. }
  686. }
  687. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement