Advertisement
ejectedmatrix

my dude

Oct 11th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.26 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Chloe.Configuration;
  7. using Chloe.Models;
  8. using Chloe.Parsers;
  9. using Chloe.Repositories;
  10. using Newtonsoft.Json;
  11.  
  12. namespace Chloe
  13. {
  14. public class MGuiRetriever : IDisposable
  15. {
  16. private readonly ChloeLogger _logger;
  17. private readonly ChloeOptions _options;
  18. private readonly int _defaultLimit = 100;
  19. private readonly ChloeDiscordClient _client;
  20. private readonly IParserRepository _parserRepository;
  21. private readonly ChloeProgressLogger _progressLogger;
  22. private readonly ICollection<ChloeAccount> _accounts;
  23.  
  24. public MGuiRetriever(ChloeOptions options, IParserRepository parserRepository, ChloeProgressLogger progressLogger, ChloeLogger chloeLogger)
  25. {
  26. _options = options;
  27. _logger = chloeLogger;
  28. _progressLogger = progressLogger;
  29. _parserRepository = parserRepository;
  30. _accounts = new HashSet<ChloeAccount>();
  31. _client = new ChloeDiscordClient(_options.Token);
  32. }
  33.  
  34. public async Task<int> RetrieveAsync()
  35. {
  36. ICollection<Task> parserTasks = new HashSet<Task>();
  37.  
  38. int totalCount = 0;
  39. bool messageExists = true;
  40. ulong? previousMessageId = null;
  41. List<Message> _totalMessages = new List<Message>();
  42.  
  43. while (messageExists)
  44. {
  45. IEnumerable<Message> messages = await _client.GetMessagesAsync(_options.ChannelId, _defaultLimit, previousMessageId);
  46. previousMessageId = messages.LastOrDefault()?.Id;
  47. _progressLogger.LogMessageCount(messages.Count());
  48. totalCount += messages.Count();
  49. _totalMessages.AddRange(messages);
  50.  
  51. // Task parserTask = await Task.Factory.StartNew(async () => await ParseMessagesAsync(messages));
  52. // parserTasks.Add(parserTask);
  53.  
  54. if (_options.HasMaxMessage && messages.Any(m => m.Id == _options.MaxMessageId))
  55. {
  56. messageExists = false;
  57. break;
  58. }
  59.  
  60. //_options.HasLimit && totalCount >= _options.ParseLimit ||
  61. if (messages.Count() < 100)
  62. {
  63. messageExists = false;
  64. break;
  65. }
  66. }
  67.  
  68. _progressLogger.LogMessagesFinished();
  69. Task.WaitAll(parserTasks.ToArray());
  70. _progressLogger.LogAccountsFinished();
  71.  
  72. File.WriteAllText("messages.json", JsonConvert.SerializeObject(_totalMessages));
  73.  
  74. //SerializeAccounts(_accounts.ToArray());
  75. return 0;
  76. }
  77.  
  78. private Task ParseMessagesAsync(IEnumerable<Message> messages)
  79. {
  80. Message[] incomingMessages = messages
  81. .Where(m => m.Type == MessageType.Default)
  82. .Where(m => m.Embeds.Count >= 1)
  83. .ToArray();
  84.  
  85. for (int mLoc = 0; mLoc < incomingMessages.Length; mLoc++)
  86. {
  87. IParser parser = _parserRepository.TryGetParserFromMessage(incomingMessages[mLoc]);
  88. if (parser == null)
  89. {
  90. _progressLogger.LogFailedParse();
  91. _logger.Log("Unable to find parser for message " + incomingMessages[mLoc].Id);
  92. continue;
  93. }
  94.  
  95. ChloeAccount account = parser.Parse(incomingMessages[mLoc]);
  96.  
  97. if (account != null)
  98. {
  99. if (!_accounts.Any(a => a.Username == account.Username && a.Password == account.Password))
  100. {
  101. _accounts.Add(account);
  102. _progressLogger.LogAccount();
  103. _logger.Log("Account " + account.Username + " (" + account.Id + ") parsed from " + parser.Name + ".");
  104. }
  105. else
  106. {
  107. _logger.Log("Account " + account.Username + " (" + account.Id + ") was already parsed.");
  108. }
  109. }
  110. else
  111. {
  112. _progressLogger.LogFailedParse();
  113. _logger.Log("Failed to parsed account from message ID " + incomingMessages[mLoc].Id);
  114. }
  115. }
  116.  
  117. return Task.CompletedTask;
  118. }
  119.  
  120. private void SerializeAccounts(ChloeAccount[] accounts)
  121. {
  122. /* ISerializer serializer;
  123.  
  124. switch(_options.FormatType)
  125. {
  126. case OutFormatType.Csv:
  127. serializer = new CsvSerializer();
  128. break;
  129. case OutFormatType.Simple:
  130. serializer = new RawSerializer();
  131. break;
  132. case OutFormatType.Json:
  133. default:
  134. serializer = new JsonSerializer();
  135. break;
  136. } */
  137. //Move the above code into a serialization repository
  138.  
  139. string totalAccounts;
  140.  
  141. if (_options.FormatType == OutFormatType.Simple)
  142. {
  143.  
  144. totalAccounts = string.Join("\n", accounts.Select(a => a.Username + ":" + a.Password));
  145. }
  146. else
  147. {
  148. totalAccounts = JsonConvert.SerializeObject(accounts, Formatting.Indented);
  149. }
  150.  
  151. if (!File.Exists(_options.OutputFilePath))
  152. {
  153. File.Create(_options.OutputFilePath).Close();
  154. File.WriteAllText(_options.OutputFilePath, totalAccounts);
  155. }
  156.  
  157. totalAccounts = null;
  158. }
  159.  
  160.  
  161. public void Dispose() => Dispose(true);
  162.  
  163. protected virtual void Dispose(bool disposing)
  164. {
  165. _client.Dispose();
  166. _accounts.Clear();
  167. // _logger.Dispose();
  168. // _options.Dispose();
  169. // _progressLogger.Dispose();
  170. // _parserRepository.Dispose();
  171.  
  172. if (disposing)
  173. {
  174. GC.SuppressFinalize(this);
  175. }
  176. }
  177. }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement