diff --git a/SimpleTGBot/TelegramBot.cs b/SimpleTGBot/TelegramBot.cs index dcc4b8c..588495e 100644 --- a/SimpleTGBot/TelegramBot.cs +++ b/SimpleTGBot/TelegramBot.cs @@ -10,10 +10,12 @@ namespace SimpleTGBot; public class TelegramBot { private string token; + private TempStorage temp; public TelegramBot(string token) { this.token = token; + temp = new TempStorage(); } /// @@ -48,8 +50,9 @@ public class TelegramBot while (Console.ReadKey().Key != ConsoleKey.Escape){} -botQuit: + botQuit: cts.Cancel(); + temp.Dispose(); } /// diff --git a/SimpleTGBot/TempStorage.cs b/SimpleTGBot/TempStorage.cs new file mode 100644 index 0000000..2ae0b70 --- /dev/null +++ b/SimpleTGBot/TempStorage.cs @@ -0,0 +1,56 @@ +namespace SimpleTGBot; + +internal class TempStorage : IDisposable +{ + private string directory; + private Dictionary createdTempFiles; + private Random rng; + + public TempStorage() + { + rng = new Random(); + + do + { + directory = Path.GetTempPath() + "/demotivatorBot-" + RandomHexString(4); + } while (Directory.Exists(directory)); + Directory.CreateDirectory(directory); + + createdTempFiles = new Dictionary(); + } + + public void Dispose() + { + foreach (var kv in createdTempFiles) + { + kv.Key.Dispose(); + if (File.Exists(kv.Value)) + { + File.Delete(kv.Value); + } + } + Directory.Delete(directory); + } + + public (string, FileStream) newTemporaryFile(string? prefix, string? extension) + { + string filename = directory + "/" + (prefix != null ? prefix + "-" : "") + RandomHexString(8) + (extension != null ? "." + extension : ""); + FileStream file = File.Open(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.None); + createdTempFiles.Add(file, filename); + return (filename, file); + } + + public void deleteTemporaryFile(FileStream file) + { + if (createdTempFiles.ContainsKey(file)) + { + File.Delete(createdTempFiles[file]); + } + file.Dispose(); + } + + private string RandomHexString(int n) + { + return rng.NextInt64(1L << (n << 2)).ToString("X" + n); + } +}