Updated display features

This commit is contained in:
2022-07-17 14:21:16 +03:00
parent b8ec6f42df
commit c415fa1c0c
16 changed files with 242 additions and 177 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,8 +3,6 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord;
using Discord.Net.Queue;
using DiscordBot.Discord.Core; using DiscordBot.Discord.Core;
using PluginManager; using PluginManager;
using PluginManager.Items; using PluginManager.Items;
@@ -45,7 +43,8 @@ public class Program
Console.Write("Prefix = "); Console.Write("Prefix = ");
var prefix = Console.ReadLine()![0]; var prefix = Console.ReadLine()![0];
if (prefix == ' ' || char.IsDigit(prefix)) return; if (prefix == ' ' || char.IsDigit(prefix))
return;
Config.AddValueToVariables("prefix", prefix.ToString(), false); Config.AddValueToVariables("prefix", prefix.ToString(), false);
} }
@@ -93,20 +92,33 @@ public class Program
Console.Clear(); Console.Clear();
Console.ForegroundColor = ConsoleColor.DarkYellow; Console.ForegroundColor = ConsoleColor.DarkYellow;
List<string> startupMessageList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage"); List<string> startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
foreach (var message in startupMessageList) Console.WriteLine(message); foreach (var message in startupMessageList)
Console.WriteLine(message);
Console.WriteLine($"Running on version: {Config.GetValue<string>("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); Console.WriteLine($"Running on version: {Config.GetValue<string>("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}");
Console.WriteLine($"Git URL: {Config.GetValue<string>("GitURL") ?? " Could not find Git URL"}"); Console.WriteLine($"Git URL: {Config.GetValue<string>("GitURL") ?? " Could not find Git URL"}");
Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command &y(sd) &ror some settings won't be saved"); Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n");
Console.ForegroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"============================ LOG ============================"); Console.WriteLine($"============================ LOG ============================");
try try
{ {
var token = Config.GetValue<string>("token"); var token = Config.GetValue<string>("token");
#if DEBUG
Console.WriteLine("Starting in DEBUG MODE");
if (!Directory.Exists("./Data/BetaTest"))
Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist");
else
{
token = File.ReadAllText("./Data/BetaTest/token.txt");
//Debug mode code...
}
#endif
var prefix = Config.GetValue<string>("prefix"); var prefix = Config.GetValue<string>("prefix");
var discordbooter = new Boot(token, prefix); var discordbooter = new Boot(token, prefix);
@@ -239,7 +251,7 @@ public class Program
if (Config.GetValue<bool>("DeleteLogsAtStartup")) if (Config.GetValue<bool>("DeleteLogsAtStartup"))
foreach (var file in Directory.GetFiles("./Output/Logs/")) foreach (var file in Directory.GetFiles("./Output/Logs/"))
File.Delete(file); File.Delete(file);
List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys"); List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys");
Config.PluginConfig.Load(); Config.PluginConfig.Load();
@@ -263,7 +275,7 @@ public class Program
} }
} }
List<string> onlineSettingsList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
foreach (var key in onlineSettingsList) foreach (var key in onlineSettingsList)
{ {
if (key.Length <= 3 || !key.Contains(' ')) continue; if (key.Length <= 3 || !key.Contains(' ')) continue;

View File

@@ -22,10 +22,20 @@ internal class Leave : DBCommand
{ {
if (Data.audioClient is not null && Data.voiceChannel is not null) if (Data.audioClient is not null && Data.voiceChannel is not null)
{ {
Data.Playlist.ClearQueue();
Data.MusicPlayer.isPlaying = false;
await Data.audioClient.StopAsync(); await Data.audioClient.StopAsync();
await Data.voiceChannel.DisconnectAsync(); await Data.voiceChannel.DisconnectAsync();
} }
if (Data.Playlist is not null)
{
Data.Playlist.ClearQueue();
Data.Playlist = new();
}
if (Data.MusicPlayer is not null)
{
Data.MusicPlayer.Stop();
Data.MusicPlayer = null;
}
} }
} }

View File

@@ -1,9 +1,5 @@
using System; using System.IO;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using PluginManager.Others;
namespace MusicCommands; namespace MusicCommands;
@@ -48,54 +44,8 @@ internal class MusicPlayer
isPlaying = false; isPlaying = false;
} }
/*
public MusicPlayer(Stream input, Stream output)
{
inputStream = input;
outputStream = output;
}
public Stream inputStream { get; } // from FFMPEG
public Stream outputStream { get; } // to Voice Channel
public bool Paused { get; set; }
private bool _stop { get; set; }
public void Stop() public void Stop()
{ {
_stop = true; isPlaying = false;
}
public async Task StartSendAudio(int bsize)
{
Paused = false;
_stop = false;
while (!_stop)
{
if (Paused) continue;
var buffer = new byte[bsize];
var bcount = await inputStream.ReadAsync(buffer, 0, bsize);
if (bcount <= 0)
{
Stop();
Data.CurrentlyRunning = null;
break;
}
try
{
await outputStream.WriteAsync(buffer, 0, bcount);
}
catch (Exception ex)
{
await outputStream.FlushAsync();
Functions.WriteLogFile(ex.ToString());
} }
} }
}*/
}

View File

@@ -19,7 +19,7 @@ namespace PluginManager
{ {
public static class PluginConfig public static class PluginConfig
{ {
public static List<Tuple<string, PluginType>> InstalledPlugins = new(); public static readonly List<Tuple<string, PluginType>> InstalledPlugins = new();
public static void Load() public static void Load()
{ {

View File

@@ -5,7 +5,7 @@ using PluginManager.Others;
namespace PluginManager.Items; namespace PluginManager.Items;
internal class Command public class Command
{ {
/// <summary> /// <summary>
/// The author of the command /// The author of the command
@@ -20,10 +20,7 @@ internal class Command
{ {
Author = message.Author; Author = message.Author;
var data = message.Content.Split(' '); var data = message.Content.Split(' ');
if (data.Length > 1) Arguments = data.Length > 1 ? new List<string>(data.MergeStrings(1).Split(' ')) : new List<string>();
Arguments = new List<string>(data.MergeStrings(1).Split(' '));
else
Arguments = new List<string>();
CommandName = data[0].Substring(1); CommandName = data[0].Substring(1);
PrefixUsed = data[0][0]; PrefixUsed = data[0][0];
} }

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
@@ -48,7 +47,7 @@ public class ConsoleCommandsHandler
} }
items.Add(new[] { "-", "-", "-" }); items.Add(new[] { "-", "-", "-" });
Console_Utilities.FormatAndAlignTable(items); Console_Utilities.FormatAndAlignTable(items, TableFormat.DEFAULT);
} }
else else
{ {
@@ -147,7 +146,7 @@ public class ConsoleCommandsHandler
{ {
Console.WriteLine($"Downloading requirements for plugin : {name}"); Console.WriteLine($"Downloading requirements for plugin : {name}");
var lines = await ServerCom.ReadTextFromFile(info[2]); var lines = await ServerCom.ReadTextFromURL(info[2]);
foreach (var line in lines) foreach (var line in lines)
{ {

View File

@@ -18,21 +18,19 @@ namespace PluginManager.Online.Helpers
/// <param name="progress">The <see cref="IProgress{T}"/> that is used to track the download progress</param> /// <param name="progress">The <see cref="IProgress{T}"/> that is used to track the download progress</param>
/// <param name="cancellation">The cancellation token</param> /// <param name="cancellation">The cancellation token</param>
/// <returns></returns> /// <returns></returns>
internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, IProgress<float>? progress = null, IProgress<long>? downloadedBytes = null, int bufferSize = 81920, CancellationToken cancellation = default)
IProgress<float>? progress = null, IProgress<long>? downloadedBytes = null, CancellationToken cancellation = default)
{ {
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation))
{ {
var contentLength = response.Content.Headers.ContentLength; var contentLength = response.Content.Headers.ContentLength;
using (var download = await response.Content.ReadAsStreamAsync()) using (var download = await response.Content.ReadAsStreamAsync(cancellation))
{ {
// Ignore progress reporting when no progress reporter was // Ignore progress reporting when no progress reporter was
// passed or when the content length is unknown // passed or when the content length is unknown
if (progress == null || !contentLength.HasValue) if (progress == null || !contentLength.HasValue)
{ {
await download.CopyToAsync(destination); await download.CopyToAsync(destination, cancellation);
return; return;
} }
@@ -41,9 +39,11 @@ namespace PluginManager.Online.Helpers
{ {
progress.Report((float)totalBytes / contentLength.Value * 100); progress.Report((float)totalBytes / contentLength.Value * 100);
downloadedBytes?.Report(totalBytes); downloadedBytes?.Report(totalBytes);
}); }
);
// Use extension method to report progress while downloading // Use extension method to report progress while downloading
await download.CopyToOtherStreamAsync(destination, 81920, relativeProgress, cancellation); await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation);
progress.Report(1); progress.Report(1);
} }
} }
@@ -57,10 +57,8 @@ namespace PluginManager.Online.Helpers
/// <returns></returns> /// <returns></returns>
internal static async Task<string> DownloadStringAsync(string url, CancellationToken cancellation = default) internal static async Task<string> DownloadStringAsync(string url, CancellationToken cancellation = default)
{ {
using (var client = new HttpClient()) using var client = new HttpClient();
{ return await client.GetStringAsync(url, cancellation);
return await client.GetStringAsync(url);
}
} }

View File

@@ -30,7 +30,7 @@ public class PluginsManager
{ {
try try
{ {
var list = await ServerCom.ReadTextFromFile(PluginsLink); var list = await ServerCom.ReadTextFromURL(PluginsLink);
var lines = list.ToArray(); var lines = list.ToArray();
var data = new List<string[]>(); var data = new List<string[]>();
@@ -43,7 +43,8 @@ public class PluginsManager
data.Add(new[] { "-", "-", "-", "-", "-" }); data.Add(new[] { "-", "-", "-", "-", "-" });
for (var i = 0; i < len; i++) for (var i = 0; i < len; i++)
{ {
if (lines[i].Length <= 2) continue; if (lines[i].Length <= 2)
continue;
var content = lines[i].Split(','); var content = lines[i].Split(',');
var display = new string[titles.Length]; var display = new string[titles.Length];
if (op == OperatingSystem.WINDOWS) if (op == OperatingSystem.WINDOWS)
@@ -54,7 +55,7 @@ public class PluginsManager
display[1] = content[1]; display[1] = content[1];
display[2] = content[2]; display[2] = content[2];
if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) if (content.Length == 6 && (content[5] != null || content[5].Length > 2))
display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString(); display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString();
else else
display[3] = "1"; display[3] = "1";
@@ -72,7 +73,8 @@ public class PluginsManager
display[0] = content[0]; display[0] = content[0];
display[1] = content[1]; display[1] = content[1];
display[2] = content[2]; display[2] = content[2];
if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString(); if (content.Length == 6 && (content[5] != null || content[5].Length > 2))
display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString();
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
display[4] = "✓"; display[4] = "✓";
else else
@@ -88,7 +90,7 @@ public class PluginsManager
} }
catch (Exception exception) catch (Exception exception)
{ {
Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message); Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
Functions.WriteErrFile(exception.ToString()); Functions.WriteErrFile(exception.ToString());
} }
} }
@@ -102,7 +104,7 @@ public class PluginsManager
{ {
try try
{ {
var list = await ServerCom.ReadTextFromFile(PluginsLink); var list = await ServerCom.ReadTextFromURL(PluginsLink);
var lines = list.ToArray(); var lines = list.ToArray();
var len = lines.Length; var len = lines.Length;
for (var i = 0; i < len; i++) for (var i = 0; i < len; i++)
@@ -110,8 +112,10 @@ public class PluginsManager
var contents = lines[i].Split(','); var contents = lines[i].Split(',');
if (contents[0] == name) if (contents[0] == name)
{ {
if (contents.Length == 6) return new[] { contents[2], contents[3], contents[5] }; if (contents.Length == 6)
if (contents.Length == 5) return new[] { contents[2], contents[3], string.Empty }; return new[] { contents[2], contents[3], contents[5] };
if (contents.Length == 5)
return new[] { contents[2], contents[3], string.Empty };
throw new Exception("Failed to download plugin. Invalid Argument Length"); throw new Exception("Failed to download plugin. Invalid Argument Length");
} }
} }

View File

@@ -9,15 +9,14 @@ using PluginManager.Others;
namespace PluginManager.Online namespace PluginManager.Online
{ {
public class ServerCom public static class ServerCom
{ {
/// <summary> /// <summary>
/// Read all lines from a file async /// Read all lines from a file async
/// </summary> /// </summary>
/// <param name="link">The link of the file</param> /// <param name="link">The link of the file</param>
/// <returns></returns> /// <returns></returns>
public static async Task<List<string>> ReadTextFromFile(string link) public static async Task<List<string>> ReadTextFromURL(string link)
{ {
string response = await OnlineFunctions.DownloadStringAsync(link); string response = await OnlineFunctions.DownloadStringAsync(link);
string[] lines = response.Split('\n'); string[] lines = response.Split('\n');
@@ -53,14 +52,11 @@ namespace PluginManager.Online
public static async Task DownloadFileAsync(string URL, string location) public static async Task DownloadFileAsync(string URL, string location)
{ {
bool isDownloading = true; bool isDownloading = true;
int c_progress = 0; float c_progress = 0;
Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100, NoColor = true }; Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100f, NoColor = true };
IProgress<float> progress = new Progress<float>(percent => IProgress<float> progress = new Progress<float>(percent => { c_progress = percent; });
{
c_progress = (int)percent;
});
Task updateProgressBarTask = new Task(() => Task updateProgressBarTask = new Task(() =>
@@ -68,7 +64,8 @@ namespace PluginManager.Online
while (isDownloading) while (isDownloading)
{ {
pbar.Update(c_progress); pbar.Update(c_progress);
if (c_progress == 100) break; if (c_progress == 100f)
break;
Thread.Sleep(500); Thread.Sleep(500);
} }
} }
@@ -78,8 +75,8 @@ namespace PluginManager.Online
await DownloadFileAsync(URL, location, progress); await DownloadFileAsync(URL, location, progress);
c_progress = 100; c_progress = pbar.Max;
pbar.Update(100); pbar.Update(100f);
isDownloading = false; isDownloading = false;
} }
} }

View File

@@ -1,4 +1,5 @@
using System; using Discord;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -48,7 +49,7 @@ namespace PluginManager.Others
if (progress.CanAproximateTo(Max)) if (progress.CanAproximateTo(Max))
Console.Write(progress + " % ✓"); Console.Write(progress + " % ✓");
else else
Console.Write(progress + " % "); Console.Write(MathF.Round(progress, 2) + " % ");
} }
else else
Console.Write(progress + $"{speed} {unit}/s "); Console.Write(progress + $"{speed} {unit}/s ");
@@ -63,7 +64,9 @@ namespace PluginManager.Others
/// A way to create a table based on input data /// A way to create a table based on input data
/// </summary> /// </summary>
/// <param name="data">The List of arrays of strings that represent the rows.</param> /// <param name="data">The List of arrays of strings that represent the rows.</param>
public static void FormatAndAlignTable(List<string[]> data) public static void FormatAndAlignTable(List<string[]> data, TableFormat format = TableFormat.CENTER_EACH_COLUMN_BASED)
{
if (format == TableFormat.CENTER_EACH_COLUMN_BASED)
{ {
char tableLine = '-'; char tableLine = '-';
char tableCross = '+'; char tableCross = '+';
@@ -71,17 +74,17 @@ namespace PluginManager.Others
int[] len = new int[data[0].Length]; int[] len = new int[data[0].Length];
foreach (var line in data) foreach (var line in data)
{
for (int i = 0; i < line.Length; i++) for (int i = 0; i < line.Length; i++)
if (line[i].Length > len[i]) if (line[i].Length > len[i])
len[i] = line[i].Length; len[i] = line[i].Length;
}
foreach (string[] row in data) foreach (string[] row in data)
{ {
if (row[0][0] == tableLine) Console.Write(tableCross); if (row[0][0] == tableLine)
else Console.Write(tableWall); Console.Write(tableCross);
else
Console.Write(tableWall);
for (int l = 0; l < row.Length; l++) for (int l = 0; l < row.Length; l++)
{ {
if (row[l][0] == tableLine) if (row[l][0] == tableLine)
@@ -97,7 +100,6 @@ namespace PluginManager.Others
} }
else else
{ {
int lenHalf = row[l].Length / 2; int lenHalf = row[l].Length / 2;
for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i) for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i)
Console.Write(" "); Console.Write(" ");
@@ -110,46 +112,135 @@ namespace PluginManager.Others
Console.Write(row[l][0] == tableLine ? tableCross : tableWall); Console.Write(row[l][0] == tableLine ? tableCross : tableWall);
} }
Console.WriteLine(); //end line Console.WriteLine(); //end line
}
return;
}
if (format == TableFormat.CENTER_OVERALL_LENGTH)
{
int maxLen = 0;
foreach (string[] row in data)
foreach (string s in row)
if (s.Length > maxLen)
maxLen = s.Length;
int div = (maxLen + 4) / 2;
foreach (string[] row in data)
{
Console.Write("\t");
if (row[0] == "-")
Console.Write("+");
else
Console.Write("|");
foreach (string s in row)
{
if (s == "-")
{
for (int i = 0; i < maxLen + 4; ++i)
Console.Write("-");
}
else if (s.Length == maxLen)
{
Console.Write(" ");
Console.Write(s);
Console.Write(" ");
}
else
{
int lenHalf = s.Length / 2;
for (int i = 0; i < div - lenHalf; ++i)
Console.Write(" ");
Console.Write(s);
for (int i = div + lenHalf + 1; i < maxLen + 4; ++i)
Console.Write(" ");
if (s.Length % 2 == 0)
Console.Write(" ");
}
if (s == "-")
Console.Write("+");
else
Console.Write("|");
}
Console.WriteLine(); //end line
}
return;
}
if (format == TableFormat.DEFAULT)
{
int[] widths = new int[data[0].Length];
int space_between_columns = 5;
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].Length; j++)
{
if (data[i][j].Length > widths[j])
widths[j] = data[i][j].Length;
} }
} }
public static void WriteColorText(string text, bool appendNewLine = true) for (int i = 0; i < data.Count; i++)
{ {
for (int j = 0; j < data[i].Length; j++)
{
if (data[i][j] == "-")
data[i][j] = " ";
Console.Write(data[i][j]);
for (int k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++)
Console.Write(" ");
}
string[] words = text.Split(' '); Console.WriteLine();
ConsoleColor fg = Console.ForegroundColor; }
Dictionary<string, ConsoleColor> colors = new Dictionary<string, ConsoleColor>()
return;
}
throw new Exception("Unknown type of table");
}
public static void WriteColorText(string text, bool appendNewLineAtEnd = true)
{ {
{ "&g", ConsoleColor.Green }, ConsoleColor initialForeGround = Console.ForegroundColor;
{ "&b", ConsoleColor.Blue }, Dictionary<char, ConsoleColor> colors = new()
{ "&r", ConsoleColor.Red }, {
{ "&m", ConsoleColor.Magenta }, { 'g', ConsoleColor.Green },
{ "&y", ConsoleColor.Yellow }, { 'b', ConsoleColor.Blue },
{ "&c", fg } { 'r', ConsoleColor.Red },
{ 'm', ConsoleColor.Magenta },
{ 'y', ConsoleColor.Yellow },
{ 'c', initialForeGround }
}; };
foreach (string word in words)
char[] input = text.ToCharArray();
for (int i = 0; i < input.Length; i++)
{ {
if (word.Length >= 2) if (input[i] == '&')
{ {
string prefix = word.Substring(0, 2); if (i + 1 < input.Length)
if (colors.ContainsKey(prefix)) {
Console.ForegroundColor = colors[prefix]; if (colors.ContainsKey(input[i + 1]))
} {
Console.ForegroundColor = colors[input[i + 1]];
string m = colors.Keys.Aggregate(word, (current, key) => current.Replace(key, "")); i++;
}
Console.Write(m + " "); }
} }
else
Console.CursorLeft--; Console.Write(input[i]);
}
if (appendNewLine)
Console.Write('\n'); Console.ForegroundColor = initialForeGround;
if (appendNewLineAtEnd)
Console.ForegroundColor = fg; Console.WriteLine();
} }
} }
} }

View File

@@ -29,3 +29,5 @@ public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL }
public enum PluginType { Command, Event, Unknown } public enum PluginType { Command, Event, Unknown }
public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize }
public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT }

View File

@@ -38,6 +38,11 @@ namespace PluginManager.Others
/// </summary> /// </summary>
public static readonly string pakFolder = @"./Data/Resources/PAK/"; public static readonly string pakFolder = @"./Data/Resources/PAK/";
/// <summary>
/// Beta testing folder
/// </summary>
public static readonly string betaFolder = @"./Data/BetaTest/";
/// <summary> /// <summary>
/// Read data from a file that is inside an archive (ZIP format) /// Read data from a file that is inside an archive (ZIP format)