WoW Auction Tracker

Program.cs 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System;
  2. using BlizzSharp;
  3. using AuctionTracker.Push;
  4. using BlizzSharp.Data;
  5. using System.Linq;
  6. using System.Collections.Generic;
  7. using System.Threading.Tasks;
  8. using System.Text;
  9. using System.Reflection;
  10. using log4net;
  11. using System.IO;
  12. using log4net.Config;
  13. using Microsoft.Extensions.Configuration;
  14. using Microsoft.Extensions.Configuration.FileExtensions;
  15. using Microsoft.Extensions.Configuration.Json;
  16. using ServiceStack.Redis;
  17. using ServiceStack.Redis.Generic;
  18. namespace AuctionTracker
  19. {
  20. class Program
  21. {
  22. const string SHORT_DURATION = "SHORT";
  23. private static BlizzSharpClient _client;
  24. private static PushClient _pushClient;
  25. private static IEnumerable<Auction> lastAuctions;
  26. private static IConfiguration _configuration;
  27. private static ILog _logger;
  28. private static string _redisPass;
  29. private static RedisManagerPool _redisPool;
  30. private static string _character;
  31. private static string _locale;
  32. private static string _realm;
  33. private static string FormatCurrency(long full)
  34. {
  35. long gold = full / 10000;
  36. long silver = (full - (gold*10000)) / 100;
  37. long copper = (full - (gold*10000) - (silver * 100));
  38. return $"{gold}G {silver}S {copper}C";
  39. }
  40. private static async Task RunUpdate()
  41. {
  42. _logger.Info($"Running Update for {_character} on {_realm}");
  43. AuctionResponse response = await _client.GetAuctionsAsync(_realm, _locale);
  44. IEnumerable<Auction> auctions = response.Auctions.Where(a => a.Owner == _character);
  45. if(lastAuctions != null)
  46. {
  47. HashSet<Auction> expiredAuctions = new HashSet<Auction>();
  48. bool removedFound = false;
  49. foreach(Auction a in lastAuctions)
  50. {
  51. if(!auctions.Any(b => b.Id == a.Id))
  52. {
  53. //the auction is now gone, but why?
  54. Item item = await _client.GetItemInfoAsync(a.Item, _locale);
  55. if(a.TimeLeft == SHORT_DURATION)
  56. {
  57. //the auction probably expired
  58. expiredAuctions.Add(a);
  59. }
  60. else
  61. {
  62. //the auction was sold
  63. await _pushClient.SendNotification($"Your Auction of {a.quantity}x {item.Name} was sold for {FormatCurrency(a.Buyout)}.", "cashregister");
  64. }
  65. removedFound = true;
  66. }
  67. }
  68. if(!removedFound)
  69. {
  70. _logger.Info("No Expired/Sold Auctions found");
  71. }
  72. if(expiredAuctions.Any())
  73. {
  74. StringBuilder sb = new StringBuilder();
  75. foreach(Auction a in expiredAuctions)
  76. {
  77. string name = (await _client.GetItemInfoAsync(a.Item, _locale)).Name;
  78. sb.AppendLine($"{a.quantity}x {name}");
  79. }
  80. await _pushClient.SendNotification($"Your Auctions have expired:\n{sb.ToString()}", "none");
  81. }
  82. }
  83. lastAuctions = auctions;
  84. //update redis database
  85. using (IRedisClient client = _redisPool.GetClient())
  86. {
  87. var auctionClient = client.As<RedisAuctionSnapshot>();
  88. foreach(Auction auction in auctions)
  89. {
  90. RedisAuctionSnapshot snapshot = await RedisAuctionSnapshot.FromAuctionClientAsync(auction, _client, _locale);
  91. auctionClient.Store(snapshot, TimeSpan.FromMinutes(20d));
  92. }
  93. }
  94. //retrieving stuff
  95. _logger.Info("Retrieving stored values");
  96. using (IRedisClient client = _redisPool.GetClient())
  97. {
  98. var auctionClient = client.As<RedisAuctionSnapshot>();
  99. foreach(RedisAuctionSnapshot item in auctionClient.GetAll())
  100. {
  101. _logger.Info(item.Name);
  102. }
  103. }
  104. }
  105. static async Task Main(string[] args)
  106. {
  107. //configure logging
  108. var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
  109. XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
  110. _logger = LogManager.GetLogger(typeof(Program));
  111. _logger.Info("Started AuctionTracker, initializing configuration");
  112. var builder = new ConfigurationBuilder()
  113. .SetBasePath(Directory.GetCurrentDirectory())
  114. .AddJsonFile("appsettings.json");
  115. _configuration = builder.Build();
  116. _character = _configuration["character"];
  117. _locale = _configuration["locale"];
  118. _realm = _configuration["realm"];
  119. _redisPass = _configuration["redisPassword"];
  120. _logger.Info("Creating Clients");
  121. _client = new BlizzSharpClient($"{_configuration["blizzardApiKey"]}");
  122. _pushClient = new PushClient($"{_configuration["pushoverSecretKey"]}", $"{_configuration["pushoverUserKey"]}");
  123. _logger.Info("Initializing redis pool");
  124. if(string.IsNullOrEmpty(_redisPass))
  125. {
  126. _redisPool = new RedisManagerPool("localhost:6379");
  127. }
  128. else
  129. {
  130. _redisPool = new RedisManagerPool($"{_redisPass}@localhost:6379");
  131. }
  132. _logger.Info("AuctionTracker started, entering loop");
  133. while(true)
  134. {
  135. await RunUpdate();
  136. System.Threading.Thread.Sleep(TimeSpan.FromMinutes(15d));
  137. }
  138. }
  139. }
  140. }