UploadFileMessage.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using System.Timers;
  8. using CardCollector.Controllers;
  9. using CardCollector.Resources;
  10. using CardCollector.DataBase.Entity;
  11. using CardCollector.DataBase.EntityDao;
  12. using OfficeOpenXml;
  13. using Telegram.Bot;
  14. using Telegram.Bot.Types;
  15. using Telegram.Bot.Types.InputFiles;
  16. using File = System.IO.File;
  17. namespace CardCollector.Commands.Message.DocumentMessage
  18. {
  19. public class UploadFileMessage : Message
  20. {
  21. protected override string CommandText => "";
  22. public override async Task Execute()
  23. {
  24. /* Очищаем чат */
  25. await User.ClearChat();
  26. User.Session.State = UserState.Default;
  27. /* Соообщаем, что начали загрузку файла */
  28. var message = await MessageController.SendMessage(User, Messages.downloading_file);
  29. /* Загружаем файл */
  30. await Utilities.DownloadFile(Update.Message!.Document!.FileId);
  31. /* Сообщаем пользователю, что начали распаковку */
  32. await MessageController.EditMessage(User, message.MessageId, Messages.unzipping_file);
  33. /* Извлекаем из архива файлы */
  34. await Task.Run(() => ZipFile.ExtractToDirectory("pack.zip", "pack", true));
  35. /* Сообщаем пользователю, что читаем документ */
  36. await MessageController.EditMessage(User, message.MessageId, Messages.reading_document);
  37. /* Парсим файл */
  38. try
  39. {
  40. await ParseExcelFile();
  41. /* Сообщаем пользователю, что удаляем данные */
  42. await MessageController.EditMessage(User, message.MessageId, Messages.deleting_files);
  43. File.Delete("pack.zip");
  44. Directory.Delete("pack", true);
  45. /* Сообщаем пользователю, что список стикеров обновится через 15 минут */
  46. await MessageController.EditMessage(User, message.MessageId, Messages.stickers_will_be_updated);
  47. }
  48. catch (Exception)
  49. {
  50. /* Сообщаем пользователю, что произошла ошибка */
  51. await MessageController.EditMessage(User, message.MessageId, Messages.unexpected_exception);
  52. }
  53. var timer = new Timer
  54. {
  55. Interval = 60 * 1000,
  56. Enabled = true,
  57. AutoReset = false
  58. };
  59. async void DeleteMessage(object sender, ElapsedEventArgs args) => await MessageController.DeleteMessage(User, message.MessageId);
  60. timer.Elapsed += DeleteMessage;
  61. }
  62. private async Task ParseExcelFile()
  63. {
  64. await Task.Run(async () =>
  65. {
  66. using var xlPackage = new ExcelPackage(new FileInfo("pack/table.xlsx"));
  67. var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here
  68. var dirInfo = new DirectoryInfo("pack");
  69. var newStickers = new List<StickerEntity>();
  70. var firstStickerName = myWorksheet.Cells[2, 1].Value.ToString();
  71. var firstStickerInfo = dirInfo.GetFiles($@"{firstStickerName}.*")[0];
  72. var isAnimated = firstStickerInfo.Extension == ".tgs";
  73. for (var rowNum = 2; myWorksheet.Cells[rowNum, 1].Value is string; rowNum++) //select starting row here
  74. {
  75. var stickerName = myWorksheet.Cells[rowNum, 1].Value.ToString();
  76. var fileInfo = dirInfo.GetFiles($@"{stickerName}.*")[0];
  77. var fields = ParseRow(myWorksheet.Cells, rowNum);
  78. await CreateSticker(fileInfo, fields["Emoji"]);
  79. var sticker = new StickerEntity
  80. {
  81. Title = fields["Title"], Author = fields["Author"],
  82. IncomeCoins = int.Parse(fields["IncomeCoins"]), IncomeGems = int.Parse(fields["IncomeGems"]),
  83. IncomeTime = int.Parse(fields["IncomeTime"]), PriceCoins = int.Parse(fields["PriceCoins"]),
  84. PriceGems = int.Parse(fields["PriceGems"]), Tier = int.Parse(fields["Tier"]),
  85. Emoji = fields["Emoji"], Description = fields["Description"]
  86. };
  87. newStickers.Add(sticker);
  88. }
  89. var timer = new Timer
  90. {
  91. Interval = 15 * 60 * 1000,
  92. Enabled = true,
  93. AutoReset = false,
  94. };
  95. async void SavingStickersToDatabase(object sender, ElapsedEventArgs args)
  96. {
  97. var stickerSet = (await Bot.Client.GetStickerSetAsync(
  98. $"{(isAnimated ? "a" : "s")}{User.Id}_by_{AppSettings.NAME}")).Stickers.ToList();
  99. Logs.LogOut("Saving " + newStickers.Count + " stickers from " + stickerSet.Count);
  100. for (var i = 0; i < newStickers.Count; i++)
  101. {
  102. var stickerId = stickerSet[i].FileId;
  103. newStickers[i].Id = stickerId;
  104. newStickers[i].Md5Hash = Utilities.CreateMd5(stickerId);
  105. await StickerDao.AddNew(newStickers[i]);
  106. }
  107. foreach (var sticker in newStickers)
  108. {
  109. try
  110. {
  111. await Bot.Client.DeleteStickerFromSetAsync(sticker.Id);
  112. }
  113. catch (Exception)
  114. {
  115. Logs.LogOut("Cant delete sticker " + sticker.Title);
  116. }
  117. }
  118. }
  119. timer.Elapsed += SavingStickersToDatabase;
  120. });
  121. }
  122. private static Dictionary<string, string> ParseRow(ExcelRange cells, int rowNum)
  123. {
  124. return new Dictionary<string, string>
  125. {
  126. {"Title", cells[rowNum, 2].Value.ToString()},
  127. {"Author", cells[rowNum, 3].Value.ToString()},
  128. {"IncomeCoins", cells[rowNum, 4].Value.ToString()},
  129. {"IncomeGems", cells[rowNum, 5].Value.ToString()},
  130. {"IncomeTime", cells[rowNum, 6].Value.ToString()},
  131. {"PriceCoins", cells[rowNum, 7].Value.ToString()},
  132. {"PriceGems", cells[rowNum, 8].Value.ToString()},
  133. {"Tier", cells[rowNum, 9].Value.ToString()},
  134. {"Emoji", cells[rowNum, 10].Value.ToString()},
  135. {"Description", cells[rowNum, 11].Value is string s ? s : ""},
  136. };
  137. }
  138. private async Task CreateSticker(FileInfo fileInfo, string emoji)
  139. {
  140. var isAnimated = fileInfo.Extension == ".tgs";
  141. var fileStream = fileInfo.OpenRead();
  142. try
  143. {
  144. if (isAnimated)
  145. await Bot.Client.AddAnimatedStickerToSetAsync(User.Id, $"a{User.Id}_by_{AppSettings.NAME}",
  146. new InputFileStream(fileStream), emoji);
  147. else
  148. {
  149. var onlineFile = await Bot.Client.UploadStickerFileAsync(User.Id, fileInfo.OpenRead());
  150. await Bot.Client.AddStickerToSetAsync(User.Id, $"s{User.Id}_by_{AppSettings.NAME}",
  151. new InputMedia(onlineFile.FileId), emoji);
  152. }
  153. }
  154. catch (Exception)
  155. {
  156. fileStream.Close();
  157. fileStream = fileInfo.OpenRead();
  158. if (isAnimated)
  159. await Bot.Client.CreateNewAnimatedStickerSetAsync(User.Id, $"a{User.Id}_by_{AppSettings.NAME}",
  160. "animated", new InputFileStream(fileStream), emoji);
  161. else
  162. {
  163. var onlineFile = await Bot.Client.UploadStickerFileAsync(User.Id, fileInfo.OpenRead());
  164. await Bot.Client.CreateNewStickerSetAsync(User.Id, $"s{User.Id}_by_{AppSettings.NAME}",
  165. "static", new InputMedia(onlineFile.FileId), emoji);
  166. }
  167. }
  168. fileStream.Close();
  169. }
  170. protected internal override bool IsMatches(string command)
  171. {
  172. return User != null
  173. ? User.Session.State == UserState.UploadFile
  174. : base.IsMatches(command);
  175. }
  176. public UploadFileMessage() { }
  177. public UploadFileMessage(UserEntity user, Update update) : base(user, update) { }
  178. }
  179. }