From c0d04a9db5e26dededda6619d914f350fea5cf6f Mon Sep 17 00:00:00 2001 From: Bitl Date: Thu, 10 Oct 2019 07:07:14 -0700 Subject: [PATCH] split launcherfuncs into seperate files part 1 --- NovetusLauncher/NovetusShared/ClientScript.cs | 235 +++ .../NovetusShared/CodeExtensions.cs | 41 + NovetusLauncher/NovetusShared/CryptoRandom.cs | 52 + NovetusLauncher/NovetusShared/DiscordRpc.cs | 90 + NovetusLauncher/NovetusShared/GlobalVars.cs | 110 ++ NovetusLauncher/NovetusShared/IniFile.cs | 60 + .../NovetusShared/LauncherFuncs.cs | 1611 ----------------- .../NovetusShared/NovetusShared.csproj | 13 + .../NovetusShared/NovetusShared.sln | 18 + .../NovetusShared/ScriptGenerator.cs | 276 +++ .../NovetusShared/SecurityFuncs.cs | 215 +++ NovetusLauncher/NovetusShared/SplashReader.cs | 116 ++ .../NovetusShared/TextLineRemover.cs | 97 + .../NovetusShared/TreeNodeHelper.cs | 95 + NovetusLauncher/NovetusShared/UPnP.cs | 47 + NovetusLauncher/NovetusShared/WebServer.cs | 274 +++ 16 files changed, 1739 insertions(+), 1611 deletions(-) create mode 100644 NovetusLauncher/NovetusShared/ClientScript.cs create mode 100644 NovetusLauncher/NovetusShared/CodeExtensions.cs create mode 100644 NovetusLauncher/NovetusShared/CryptoRandom.cs create mode 100644 NovetusLauncher/NovetusShared/DiscordRpc.cs create mode 100644 NovetusLauncher/NovetusShared/GlobalVars.cs create mode 100644 NovetusLauncher/NovetusShared/IniFile.cs create mode 100644 NovetusLauncher/NovetusShared/NovetusShared.sln create mode 100644 NovetusLauncher/NovetusShared/ScriptGenerator.cs create mode 100644 NovetusLauncher/NovetusShared/SecurityFuncs.cs create mode 100644 NovetusLauncher/NovetusShared/SplashReader.cs create mode 100644 NovetusLauncher/NovetusShared/TextLineRemover.cs create mode 100644 NovetusLauncher/NovetusShared/TreeNodeHelper.cs create mode 100644 NovetusLauncher/NovetusShared/UPnP.cs create mode 100644 NovetusLauncher/NovetusShared/WebServer.cs diff --git a/NovetusLauncher/NovetusShared/ClientScript.cs b/NovetusLauncher/NovetusShared/ClientScript.cs new file mode 100644 index 0000000..618d311 --- /dev/null +++ b/NovetusLauncher/NovetusShared/ClientScript.cs @@ -0,0 +1,235 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:02 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public class ClientScript + { + private static string basedir = "rbxasset://../../../shareddata/charcustom/"; + private static string basemapdir = "rbxasset://../../../maps/"; + private static string hatdir = basedir + "hats/"; + private static string facedir = basedir + "faces/"; + private static string headdir = basedir + "heads/"; + private static string tshirtdir = basedir + "tshirts/"; + private static string shirtdir = basedir + "shirts/"; + private static string pantsdir = basedir + "pants/"; + private static string extradir = basedir + "custom/"; + + public static string GetArgsFromTag(string code, string tag, string endtag) + { + int pFrom = code.IndexOf(tag) + tag.Length; + int pTo = code.LastIndexOf(endtag); + + string result = code.Substring(pFrom, pTo - pFrom); + + return result; + } + + public static ScriptGenerator.ScriptType GetTypeFromTag(string tag, string endtag) + { + if (tag.Contains("client") && endtag.Contains("client")) + { + return ScriptGenerator.ScriptType.Client; + } + else if (tag.Contains("server") && endtag.Contains("server") || tag.Contains("no3d") && endtag.Contains("no3d")) + { + return ScriptGenerator.ScriptType.Server; + } + else if (tag.Contains("solo") && endtag.Contains("solo")) + { + return ScriptGenerator.ScriptType.Solo; + } + else if (tag.Contains("studio") && endtag.Contains("studio")) + { + return ScriptGenerator.ScriptType.Studio; + } + else + { + return ScriptGenerator.ScriptType.None; + } + } + + public static string GetRawArgsForType(ScriptGenerator.ScriptType type, string md5s, string luafile) + { + if (type == ScriptGenerator.ScriptType.Client) + { + if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) + { + return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) + { + return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) + { + return "dofile('" + luafile + "'); _G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false) + { + return "dofile('" + luafile + "'); _G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else + { + return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + } + else if (type == ScriptGenerator.ScriptType.Server) + { + return "dofile('" + luafile + "'); _G.CSServer(" + GlobalVars.RobloxPort + "," + GlobalVars.PlayerLimit + "," + md5s + ")"; + } + else if (type == ScriptGenerator.ScriptType.Solo) + { + if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) + { + return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) + { + return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'Player'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) + { + return "dofile('" + luafile + "'); _G.CSSolo(0,'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false ) + { + return "dofile('" + luafile + "'); _G.CSSolo(0,'Player'," + GlobalVars.sololoadtext + ")"; + } + else + { + return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + } + else if (type == ScriptGenerator.ScriptType.Studio) + { + return "dofile('" + luafile + "');"; + } + else + { + return ""; + } + } + + public static string GetRawArgsFromTag(string tag, string endtag, string md5s, string luafile) + { + return GetRawArgsForType(GetTypeFromTag(tag, endtag), md5s, luafile); + } + + public static int ConvertIconStringToInt() + { + if (GlobalVars.Custom_Icon_Offline == "BC") + { + return 1; + } + else if (GlobalVars.Custom_Icon_Offline == "TBC") + { + return 2; + } + else if (GlobalVars.Custom_Icon_Offline == "OBC") + { + return 3; + } + else if (GlobalVars.Custom_Icon_Offline == "NBC") + { + return 0; + } + + return 0; + } + + public static string GetFolderAndMapName(string source, string seperator = " -") + { + try + { + string result = source.Substring(0, source.IndexOf(seperator)); + + if (File.Exists(GlobalVars.MapsDir + @"\\" + result + @"\\" + source)) + { + return result + @"\\" + source; + } + else + { + return ""; + } + } + catch (Exception) + { + return ""; + } + } + + public static string CompileScript(string code, string tag, string endtag, string mapfile, string luafile, string rbxexe) + { + if (GlobalVars.FixScriptMapMode) + { + ScriptGenerator.GenerateScriptForClient(GetTypeFromTag(tag, endtag), GlobalVars.SelectedClient); + } + + string extractedCode = GetArgsFromTag(code, tag, endtag); + + string md5dir = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(Assembly.GetExecutingAssembly().Location) : ""; + string md5script = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua") : ""; + string md5exe = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(rbxexe) : ""; + string md5s = "'" + md5exe + "','" + md5dir + "','" + md5script + "'"; + string compiled = extractedCode.Replace("%mapfile%",mapfile) + .Replace("%luafile%",luafile) + .Replace("%charapp%",GlobalVars.CharacterID) + .Replace("%ip%",GlobalVars.IP) + .Replace("%port%",GlobalVars.RobloxPort.ToString()) + .Replace("%name%",GlobalVars.PlayerName) + .Replace("%icone%",ConvertIconStringToInt().ToString()) + .Replace("%icon%",GlobalVars.Custom_Icon_Offline) + .Replace("%id%",GlobalVars.UserID.ToString()) + .Replace("%face%",GlobalVars.Custom_Face_Offline) + .Replace("%head%",GlobalVars.Custom_Head_Offline) + .Replace("%tshirt%",GlobalVars.Custom_T_Shirt_Offline) + .Replace("%shirt%",GlobalVars.Custom_Shirt_Offline) + .Replace("%pants%",GlobalVars.Custom_Pants_Offline) + .Replace("%hat1%",GlobalVars.Custom_Hat1ID_Offline) + .Replace("%hat2%",GlobalVars.Custom_Hat2ID_Offline) + .Replace("%hat3%",GlobalVars.Custom_Hat3ID_Offline) + .Replace("%faced%",facedir + GlobalVars.Custom_Face_Offline) + .Replace("%headd%",headdir + GlobalVars.Custom_Head_Offline) + .Replace("%tshirtd%",tshirtdir + GlobalVars.Custom_T_Shirt_Offline) + .Replace("%shirtd%",shirtdir + GlobalVars.Custom_Shirt_Offline) + .Replace("%pantsd%",pantsdir + GlobalVars.Custom_Pants_Offline) + .Replace("%hat1d%",hatdir + GlobalVars.Custom_Hat1ID_Offline) + .Replace("%hat2d%",hatdir + GlobalVars.Custom_Hat2ID_Offline) + .Replace("%hat3d%",hatdir + GlobalVars.Custom_Hat3ID_Offline) + .Replace("%headcolor%",GlobalVars.HeadColorID.ToString()) + .Replace("%torsocolor%",GlobalVars.TorsoColorID.ToString()) + .Replace("%larmcolor%",GlobalVars.LeftArmColorID.ToString()) + .Replace("%llegcolor%",GlobalVars.LeftLegColorID.ToString()) + .Replace("%rarmcolor%",GlobalVars.RightArmColorID.ToString()) + .Replace("%rlegcolor%",GlobalVars.RightLegColorID.ToString()) + .Replace("%rlegcolor%",GlobalVars.SelectedClientMD5) + .Replace("%md5launcher%",md5dir) + .Replace("%md5script%",GlobalVars.SelectedClientMD5) + .Replace("%md5exe%",GlobalVars.SelectedClientScriptMD5) + .Replace("%md5scriptd%",md5script) + .Replace("%md5exed%",md5exe) + .Replace("%limit%",GlobalVars.PlayerLimit.ToString()) + .Replace("%extra%",GlobalVars.Custom_Extra) + .Replace("%extrad%",extradir + GlobalVars.Custom_Extra) + .Replace("%hat4d%",hatdir + GlobalVars.Custom_Extra) + .Replace("%args%",GetRawArgsFromTag(tag, endtag, md5s, luafile)) + .Replace("%facews%",GlobalVars.WebServer_FaceDir + GlobalVars.Custom_Face_Offline) + .Replace("%headws%",GlobalVars.WebServer_HeadDir + GlobalVars.Custom_Head_Offline) + .Replace("%tshirtws%",GlobalVars.WebServer_TShirtDir + GlobalVars.Custom_T_Shirt_Offline) + .Replace("%shirtws%",GlobalVars.WebServer_ShirtDir + GlobalVars.Custom_Shirt_Offline) + .Replace("%pantsws%",GlobalVars.WebServer_PantsDir + GlobalVars.Custom_Pants_Offline) + .Replace("%hat1ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat1ID_Offline) + .Replace("%hat2ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat2ID_Offline) + .Replace("%hat3ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat3ID_Offline) + .Replace("%extraws%",GlobalVars.WebServer_ExtraDir + GlobalVars.Custom_Extra) + .Replace("%hat4ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Extra) + .Replace("%bodycolors%",GlobalVars.WebServer_BodyColors) + .Replace("%mapfiled%",basemapdir + GetFolderAndMapName(GlobalVars.Map)); + return compiled; + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/CodeExtensions.cs b/NovetusLauncher/NovetusShared/CodeExtensions.cs new file mode 100644 index 0000000..e62d389 --- /dev/null +++ b/NovetusLauncher/NovetusShared/CodeExtensions.cs @@ -0,0 +1,41 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:00 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class RichTextBoxExtensions + { + public static void AppendText(this RichTextBox box, string text, Color color) + { + box.SelectionStart = box.TextLength; + box.SelectionLength = 0; + + box.SelectionColor = color; + box.AppendText(text); + box.SelectionColor = box.ForeColor; + } + } + + public static class ProcessExtensions + { + public static bool IsRunning(this Process process) + { + try {Process.GetProcessById(process.Id);} + catch (InvalidOperationException) { return false; } + catch (ArgumentException){return false;} + return true; + } + } + + public static class StringExtensions + { + public static bool Contains(this string source, string toCheck, StringComparison comp) + { + if (source == null) return false; + return source.IndexOf(toCheck, comp) >= 0; + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/CryptoRandom.cs b/NovetusLauncher/NovetusShared/CryptoRandom.cs new file mode 100644 index 0000000..16531dc --- /dev/null +++ b/NovetusLauncher/NovetusShared/CryptoRandom.cs @@ -0,0 +1,52 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:06 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + + public class CryptoRandom : RandomNumberGenerator + { + private static RandomNumberGenerator r; + + public CryptoRandom() + { + r = RandomNumberGenerator.Create(); + } + + ///An array of bytes to contain random numbers. + public override void GetBytes(byte[] buffer) + { + r.GetBytes(buffer); + } + + public override void GetNonZeroBytes(byte[] data) + { + r.GetNonZeroBytes(data); + } + public double NextDouble() + { + byte[] b = new byte[4]; + r.GetBytes(b); + return (double)BitConverter.ToUInt32(b, 0) / UInt32.MaxValue; + } + + ///The inclusive lower bound of the random number returned. + ///The exclusive upper bound of the random number returned. maxValue must be greater than or equal to minValue. + public int Next(int minValue, int maxValue) + { + return (int)Math.Round(NextDouble() * (maxValue - minValue - 1)) + minValue; + } + public int Next() + { + return Next(0, Int32.MaxValue); + } + + ///The inclusive upper bound of the random number returned. maxValue must be greater than or equal 0 + public int Next(int maxValue) + { + return Next(0, maxValue); + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/DiscordRpc.cs b/NovetusLauncher/NovetusShared/DiscordRpc.cs new file mode 100644 index 0000000..33c73fe --- /dev/null +++ b/NovetusLauncher/NovetusShared/DiscordRpc.cs @@ -0,0 +1,90 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 6:57 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + + //Discord Rich Presence Integration :D + public class DiscordRpc + { + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ReadyCallback(); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void DisconnectedCallback(int errorCode, string message); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ErrorCallback(int errorCode, string message); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void JoinCallback(string secret); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void SpectateCallback(string secret); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RequestCallback(JoinRequest request); + + public struct EventHandlers + { + public ReadyCallback readyCallback; + public DisconnectedCallback disconnectedCallback; + public ErrorCallback errorCallback; + public JoinCallback joinCallback; + public SpectateCallback spectateCallback; + public RequestCallback requestCallback; + } + + [System.Serializable] + public struct RichPresence + { + public string state; /* max 128 bytes */ + public string details; /* max 128 bytes */ + public long startTimestamp; + public long endTimestamp; + public string largeImageKey; /* max 32 bytes */ + public string largeImageText; /* max 128 bytes */ + public string smallImageKey; /* max 32 bytes */ + public string smallImageText; /* max 128 bytes */ + public string partyId; /* max 128 bytes */ + public int partySize; + public int partyMax; + public string matchSecret; /* max 128 bytes */ + public string joinSecret; /* max 128 bytes */ + public string spectateSecret; /* max 128 bytes */ + public bool instance; + } + + [System.Serializable] + public struct JoinRequest + { + public string userId; + public string username; + public string avatar; + } + + public enum Reply + { + No = 0, + Yes = 1, + Ignore = 2 + } + + [DllImport("discord-rpc", EntryPoint = "Discord_Initialize", CallingConvention = CallingConvention.Cdecl)] + public static extern void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId); + + [DllImport("discord-rpc", EntryPoint = "Discord_Shutdown", CallingConvention = CallingConvention.Cdecl)] + public static extern void Shutdown(); + + [DllImport("discord-rpc", EntryPoint = "Discord_RunCallbacks", CallingConvention = CallingConvention.Cdecl)] + public static extern void RunCallbacks(); + + [DllImport("discord-rpc", EntryPoint = "Discord_UpdatePresence", CallingConvention = CallingConvention.Cdecl)] + public static extern void UpdatePresence(ref RichPresence presence); + + [DllImport("discord-rpc", EntryPoint = "Discord_Respond", CallingConvention = CallingConvention.Cdecl)] + public static extern void Respond(string userId, Reply reply); + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/GlobalVars.cs b/NovetusLauncher/NovetusShared/GlobalVars.cs new file mode 100644 index 0000000..f60e04a --- /dev/null +++ b/NovetusLauncher/NovetusShared/GlobalVars.cs @@ -0,0 +1,110 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:05 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class GlobalVars + { + public static string RootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + public static string BasePath = RootPath.Replace(@"\",@"\\"); + public static string DataPath = BasePath + "\\shareddata"; + public static string ConfigDir = BasePath + "\\config"; + public static string ClientDir = BasePath + "\\clients"; + public static string MapsDir = BasePath + "\\maps"; + public static string CustomPlayerDir = DataPath + "\\charcustom"; + public static string IP = "localhost"; + public static string Version = ""; + public static string SharedArgs = ""; + public static string ScriptName = "CSMPFunctions"; + public static string ScriptGenName = "CSMPBoot"; + public static SimpleHTTPServer WebServer = null; + public static bool IsWebServerOn = false; + //vars for loader + public static bool ReadyToLaunch = false; + //server settings. + public static bool UPnP = false; + public static string Map = ""; + public static string FullMapPath = ""; + public static int RobloxPort = 53640; + public static int DefaultRobloxPort = 53640; + public static int WebServer_Port = (RobloxPort+1); + public static int PlayerLimit = 12; + //player settings + public static int UserID = 0; + public static string PlayerName = "Player"; + //launcher settings. + public static bool CloseOnLaunch = false; + public static bool LocalPlayMode = false; + //client shit + public static string SelectedClient = ""; + public static string DefaultClient = ""; + public static string DefaultMap = ""; + public static bool UsesPlayerName = false; + public static bool UsesID = true; + public static string SelectedClientDesc = ""; + public static string Warning = ""; + public static bool LegacyMode = false; + public static string SelectedClientMD5 = ""; + public static string SelectedClientScriptMD5 = ""; + public static bool FixScriptMapMode = false; + public static bool AlreadyHasSecurity = false; + public static string CustomArgs = ""; + //charcustom + public static string Custom_Hat1ID_Offline = "NoHat.rbxm"; + public static string Custom_Hat2ID_Offline = "NoHat.rbxm"; + public static string Custom_Hat3ID_Offline = "NoHat.rbxm"; + public static string Custom_Face_Offline = "DefaultFace.rbxm"; + public static string Custom_Head_Offline = "DefaultHead.rbxm"; + public static string Custom_T_Shirt_Offline = "NoTShirt.rbxm"; + public static string Custom_Shirt_Offline = "NoShirt.rbxm"; + public static string Custom_Pants_Offline = "NoPants.rbxm"; + public static string Custom_Icon_Offline = "NBC"; + public static int HeadColorID = 24; + public static int TorsoColorID = 23; + public static int LeftArmColorID = 24; + public static int RightArmColorID = 24; + public static int LeftLegColorID = 119; + public static int RightLegColorID = 119; + public static string loadtext = ""; + public static string sololoadtext = ""; + public static string CharacterID =""; + public static string Custom_Extra = "NoExtra.rbxm"; + public static bool Custom_Extra_ShowHats = false; + public static bool Custom_Extra_SelectionIsHat = false; + //color menu. + public static string ColorMenu_HeadColor = "Color [A=255, R=245, G=205, B=47]"; + public static string ColorMenu_TorsoColor = "Color [A=255, R=13, G=105, B=172]"; + public static string ColorMenu_LeftArmColor = "Color [A=255, R=245, G=205, B=47]"; + public static string ColorMenu_RightArmColor = "Color [A=255, R=245, G=205, B=47]"; + public static string ColorMenu_LeftLegColor = "Color [A=255, R=164, G=189, B=71]"; + public static string ColorMenu_RightLegColor = "Color [A=255, R=164, G=189, B=71]"; + public static bool AdminMode = false; + public static string important = ""; + //discord + public static DiscordRpc.RichPresence presence; + public static string appid = "505955125727330324"; + public static string imagekey_large = "novetus_large"; + //webserver + public static string WebServerURI = "http://" + IP + ":" + (WebServer_Port).ToString(); + public static string LocalWebServerURI = "http://localhost:" + (WebServer_Port).ToString(); + public static string WebServer_CustomPlayerDir = WebServerURI + "/charcustom/"; + public static string WebServer_HatDir = WebServer_CustomPlayerDir + "hats/"; + public static string WebServer_FaceDir = WebServer_CustomPlayerDir + "faces/"; + public static string WebServer_HeadDir = WebServer_CustomPlayerDir + "heads/"; + public static string WebServer_TShirtDir = WebServer_CustomPlayerDir + "tshirts/"; + public static string WebServer_ShirtDir = WebServer_CustomPlayerDir + "shirts/"; + public static string WebServer_PantsDir = WebServer_CustomPlayerDir + "pants/"; + public static string WebServer_ExtraDir = WebServer_CustomPlayerDir + "custom/"; + public static string WebServer_BodyColors = WebServer_CustomPlayerDir + "bodycolors.rbxm"; + //itemmaker + public static bool DisabledHelp = false; + + public static string MultiLine(params string[] args) + { + return string.Join(Environment.NewLine, args); + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/IniFile.cs b/NovetusLauncher/NovetusShared/IniFile.cs new file mode 100644 index 0000000..5e1a4b1 --- /dev/null +++ b/NovetusLauncher/NovetusShared/IniFile.cs @@ -0,0 +1,60 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:04 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +//credit to BLaZiNiX + public class IniFile + { + public string path; + + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string section, + string key,string val,string filePath); + [DllImport("kernel32")] + private static extern int GetPrivateProfileString(string section, + string key,string def, StringBuilder retVal, + int size,string filePath); + + /// + /// INIFile Constructor. + /// + /// + public IniFile(string INIPath) + { + path = INIPath; + } + /// + /// Write Data to the INI File + /// + /// + /// Section name + /// + /// Key Name + /// + /// Value Name + public void IniWriteValue(string Section,string Key,string Value) + { + WritePrivateProfileString(Section,Key,Value,this.path); + } + + /// + /// Read Data Value From the Ini File + /// + /// + /// + /// + /// + public string IniReadValue(string Section,string Key) + { + StringBuilder temp = new StringBuilder(255); + int i = GetPrivateProfileString(Section,Key,"",temp, + 255, this.path); + return temp.ToString(); + + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/LauncherFuncs.cs b/NovetusLauncher/NovetusShared/LauncherFuncs.cs index 968b4a9..6ed55f4 100644 --- a/NovetusLauncher/NovetusShared/LauncherFuncs.cs +++ b/NovetusLauncher/NovetusShared/LauncherFuncs.cs @@ -653,1615 +653,4 @@ namespace NovetusShared GlobalVars.UserID = randomID; } } - - //Discord Rich Presence Integration :D - public class DiscordRpc - { - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void ReadyCallback(); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void DisconnectedCallback(int errorCode, string message); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void ErrorCallback(int errorCode, string message); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void JoinCallback(string secret); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void SpectateCallback(string secret); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void RequestCallback(JoinRequest request); - - public struct EventHandlers - { - public ReadyCallback readyCallback; - public DisconnectedCallback disconnectedCallback; - public ErrorCallback errorCallback; - public JoinCallback joinCallback; - public SpectateCallback spectateCallback; - public RequestCallback requestCallback; - } - - [System.Serializable] - public struct RichPresence - { - public string state; /* max 128 bytes */ - public string details; /* max 128 bytes */ - public long startTimestamp; - public long endTimestamp; - public string largeImageKey; /* max 32 bytes */ - public string largeImageText; /* max 128 bytes */ - public string smallImageKey; /* max 32 bytes */ - public string smallImageText; /* max 128 bytes */ - public string partyId; /* max 128 bytes */ - public int partySize; - public int partyMax; - public string matchSecret; /* max 128 bytes */ - public string joinSecret; /* max 128 bytes */ - public string spectateSecret; /* max 128 bytes */ - public bool instance; - } - - [System.Serializable] - public struct JoinRequest - { - public string userId; - public string username; - public string avatar; - } - - public enum Reply - { - No = 0, - Yes = 1, - Ignore = 2 - } - - [DllImport("discord-rpc", EntryPoint = "Discord_Initialize", CallingConvention = CallingConvention.Cdecl)] - public static extern void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId); - - [DllImport("discord-rpc", EntryPoint = "Discord_Shutdown", CallingConvention = CallingConvention.Cdecl)] - public static extern void Shutdown(); - - [DllImport("discord-rpc", EntryPoint = "Discord_RunCallbacks", CallingConvention = CallingConvention.Cdecl)] - public static extern void RunCallbacks(); - - [DllImport("discord-rpc", EntryPoint = "Discord_UpdatePresence", CallingConvention = CallingConvention.Cdecl)] - public static extern void UpdatePresence(ref RichPresence presence); - - [DllImport("discord-rpc", EntryPoint = "Discord_Respond", CallingConvention = CallingConvention.Cdecl)] - public static extern void Respond(string userId, Reply reply); - } - - public static class TextLineRemover - { - public static void RemoveTextLines(IList linesToRemove, string filename, string tempFilename) - { - // Initial values - int lineNumber = 0; - int linesRemoved = 0; - DateTime startTime = DateTime.Now; - - // Read file - using (var sr = new StreamReader(filename)) - { - // Write new file - using (var sw = new StreamWriter(tempFilename)) - { - // Read lines - string line; - while ((line = sr.ReadLine()) != null) - { - lineNumber++; - // Look for text to remove - if (!ContainsString(line, linesToRemove)) - { - // Keep lines that does not match - sw.WriteLine(line); - } - else - { - // Ignore lines that DO match - linesRemoved++; - InvokeOnRemovedLine(new RemovedLineArgs { RemovedLine = line, RemovedLineNumber = lineNumber}); - } - } - } - } - // Delete original file - File.Delete(filename); - - // ... and put the temp file in its place. - File.Move(tempFilename, filename); - - // Final calculations - DateTime endTime = DateTime.Now; - InvokeOnFinished(new FinishedArgs {LinesRemoved = linesRemoved, TotalLines = lineNumber, TotalTime = endTime.Subtract(startTime)}); - } - - private static bool ContainsString(string line, IEnumerable linesToRemove) - { - foreach (var lineToRemove in linesToRemove) - { - if(line.Contains(lineToRemove)) - return true; - } - return false; - } - - public static event RemovedLine OnRemovedLine; - public static event Finished OnFinished; - - public static void InvokeOnFinished(FinishedArgs args) - { - Finished handler = OnFinished; - if (handler != null) handler(null, args); - } - - public static void InvokeOnRemovedLine(RemovedLineArgs args) - { - RemovedLine handler = OnRemovedLine; - if (handler != null) handler(null, args); - } - } - - public delegate void Finished(object sender, FinishedArgs args); - - public class FinishedArgs - { - public int TotalLines { get; set; } - public int LinesRemoved { get; set; } - public TimeSpan TotalTime { get; set; } - } - - public delegate void RemovedLine(object sender, RemovedLineArgs args); - - public class RemovedLineArgs - { - public string RemovedLine { get; set; } - public int RemovedLineNumber { get; set; } - } - - - - /// - /// Description of SecurityFuncs. - /// - public class SecurityFuncs - { - [DllImport("user32.dll")] - static extern int SetWindowText(IntPtr hWnd, string text); - - public SecurityFuncs() - { - } - - public static string RandomString(int length) - { - CryptoRandom random = new CryptoRandom(); - const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; - return new string(Enumerable.Repeat(chars, length) - .Select(s => s[random.Next(s.Length)]).ToArray()); - } - - public static string RandomString() - { - CryptoRandom random = new CryptoRandom(); - return RandomString(random.Next(5, 20)); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static bool IsBase64String(string s) - { - s = s.Trim(); - return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None); - } - - public static void RegisterURLProtocol(string protocolName, string applicationPath, string description) - { - RegistryKey subKey = Registry.ClassesRoot.CreateSubKey(protocolName); - subKey.SetValue((string) null, (object) description); - subKey.SetValue("URL Protocol", (object) string.Empty); - Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell"); - Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell\\open"); - Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell\\open\\command").SetValue((string) null, (object) ("\"" + applicationPath + "\" \"%1\"")); - } - - public static long UnixTimeNow() - { - var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); - return (long)timeSpan.TotalSeconds; - } - - public static bool checkClientMD5(string client) - { - if (GlobalVars.AdminMode != true) - { - if (GlobalVars.AlreadyHasSecurity != true) - { - string rbxexe = ""; - if (GlobalVars.LegacyMode == true) - { - rbxexe = GlobalVars.BasePath + "\\clients\\" + client + "\\RobloxApp.exe"; - } - else - { - rbxexe = GlobalVars.BasePath + "\\clients\\" + client + "\\RobloxApp_client.exe"; - } - using (var md5 = MD5.Create()) - { - using (var stream = File.OpenRead(rbxexe)) - { - byte[] hash = md5.ComputeHash(stream); - string clientMD5 = BitConverter.ToString(hash).Replace("-", ""); - if (clientMD5.Equals(GlobalVars.SelectedClientMD5)) - { - return true; - } - else - { - return false; - } - } - } - } - else - { - return true; - } - } - else - { - return true; - } - } - - public static bool checkScriptMD5(string client) - { - if (GlobalVars.AdminMode != true) - { - if (GlobalVars.AlreadyHasSecurity != true) - { - string rbxscript = GlobalVars.BasePath + "\\clients\\" + client + "\\content\\scripts\\" + GlobalVars.ScriptName + ".lua"; - using (var md5 = MD5.Create()) - { - using (var stream = File.OpenRead(rbxscript)) - { - byte[] hash = md5.ComputeHash(stream); - string clientMD5 = BitConverter.ToString(hash).Replace("-", ""); - if (clientMD5.Equals(GlobalVars.SelectedClientScriptMD5)) - { - return true; - } - else - { - return false; - } - } - } - } - else - { - return true; - } - } - else - { - return true; - } - } - - public static string CalculateMD5(string filename) - { - using (var md5 = MD5.Create()) - { - using (var stream = File.OpenRead(filename)) - { - return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-",""); - } - } - } - - public static bool IsElevated - { - get - { - return WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid); - } - } - - public static string RandomStringTitle() - { - CryptoRandom random = new CryptoRandom(); - return new String(' ', random.Next(20)); - } - - public static void RenameWindow(Process exe, ScriptGenerator.ScriptType type) - { - if (GlobalVars.AlreadyHasSecurity != true) - { - int time = 500; - BackgroundWorker worker = new BackgroundWorker(); - worker.DoWork += (obj, e) => WorkerDoWork(exe, type, time, worker, GlobalVars.SelectedClient); - worker.RunWorkerAsync(); - } - } - - private static void WorkerDoWork(Process exe, ScriptGenerator.ScriptType type, int time, BackgroundWorker worker, string clientname) - { - if (exe.IsRunning() == true) - { - while (exe.IsRunning() == true) - { - if (exe.IsRunning() != true) - { - worker.DoWork -= (obj, e) => WorkerDoWork(exe, type, time, worker, clientname); - worker.CancelAsync(); - worker.Dispose(); - break; - } - - if (type == ScriptGenerator.ScriptType.Client) - { - SetWindowText(exe.MainWindowHandle, "Novetus " + GlobalVars.Version + " - " + clientname + " " + ScriptGenerator.GetNameForType(type) + " [" + GlobalVars.IP + ":" + GlobalVars.RobloxPort + "]" + RandomStringTitle()); - } - else if (type == ScriptGenerator.ScriptType.Server || type == ScriptGenerator.ScriptType.Solo || type == ScriptGenerator.ScriptType.Studio) - { - SetWindowText(exe.MainWindowHandle, "Novetus " + GlobalVars.Version + " - " + clientname + " " + ScriptGenerator.GetNameForType(type) + " [" + GlobalVars.Map + "]" + RandomStringTitle()); - } - Thread.Sleep(time); - } - } - else - { - Thread.Sleep(time); - RenameWindow(exe, type); - } - } - } - - public static class RichTextBoxExtensions - { - public static void AppendText(this RichTextBox box, string text, Color color) - { - box.SelectionStart = box.TextLength; - box.SelectionLength = 0; - - box.SelectionColor = color; - box.AppendText(text); - box.SelectionColor = box.ForeColor; - } - } - - public static class ProcessExtensions - { - public static bool IsRunning(this Process process) - { - try {Process.GetProcessById(process.Id);} - catch (InvalidOperationException) { return false; } - catch (ArgumentException){return false;} - return true; - } - } - - public class CryptoRandom : RandomNumberGenerator - { - private static RandomNumberGenerator r; - - public CryptoRandom() - { - r = RandomNumberGenerator.Create(); - } - - ///An array of bytes to contain random numbers. - public override void GetBytes(byte[] buffer) - { - r.GetBytes(buffer); - } - - public override void GetNonZeroBytes(byte[] data) - { - r.GetNonZeroBytes(data); - } - public double NextDouble() - { - byte[] b = new byte[4]; - r.GetBytes(b); - return (double)BitConverter.ToUInt32(b, 0) / UInt32.MaxValue; - } - - ///The inclusive lower bound of the random number returned. - ///The exclusive upper bound of the random number returned. maxValue must be greater than or equal to minValue. - public int Next(int minValue, int maxValue) - { - return (int)Math.Round(NextDouble() * (maxValue - minValue - 1)) + minValue; - } - public int Next() - { - return Next(0, Int32.MaxValue); - } - - ///The inclusive upper bound of the random number returned. maxValue must be greater than or equal 0 - public int Next(int maxValue) - { - return Next(0, maxValue); - } - } - - - /* - * so, in order for us to generate a good script, we have to: - * - specify the script header that gives us our setting adjustments - * - add player customization into the script - * - call the main script - * - call the function - * - * now, we have to call the funtion associated for the action, such as starting the main client or something - * we also need to make sure that when we add the option, we'll need to adapt map loading to work RBX2007 style for the clients using the script generator. - */ - - public class ScriptGenerator - { - public ScriptGenerator() - { - } - - public enum ScriptType - { - Client = 0, - Server = 1, - Solo = 2, - Studio = 3, - None = 4 - } - - public static string GetScriptFuncForType(ScriptType type, string client) - { - string rbxexe = ""; - if (GlobalVars.LegacyMode == true) - { - rbxexe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\clients\\" + client + @"\\RobloxApp.exe"; - } - else - { - rbxexe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\clients\\" + client + @"\\RobloxApp_client.exe"; - } - - string md5dir = SecurityFuncs.CalculateMD5(Assembly.GetExecutingAssembly().Location); - string md5script = SecurityFuncs.CalculateMD5(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua"); - string md5exe = SecurityFuncs.CalculateMD5(rbxexe); - string md5s = "'" + md5exe + "','" + md5dir + "','" + md5script + "'"; - if (type == ScriptType.Client) - { - if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) - { - return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) - { - return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) - { - return "_G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false) - { - return "_G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else - { - return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - } - else if (type == ScriptType.Server) - { - return "_G.CSServer(" + GlobalVars.RobloxPort + "," + GlobalVars.PlayerLimit + "," + md5s + ")"; - } - else if (type == ScriptType.Solo) - { - if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) - { - return "_G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) - { - return "_G.CSSolo(" + GlobalVars.UserID + ",'Player'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) - { - return "_G.CSSolo(0,'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false ) - { - return "_G.CSSolo(0,'Player'," + GlobalVars.sololoadtext + ")"; - } - else - { - return "_G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - } - else if (type == ScriptType.Studio) - { - return ""; - } - else - { - return ""; - } - } - - public static string GetNameForType(ScriptType type) - { - if (type == ScriptType.Client) - { - return "Client"; - } - else if (type == ScriptType.Server) - { - return "Server"; - } - else if (type == ScriptType.Solo) - { - return "Play Solo"; - } - else if (type == ScriptType.Studio) - { - return "Studio"; - } - else - { - return ""; - } - } - - /* - public static string[] GetScriptContents(string scriptPath) - { - List array = new List(); - string line = ""; - using (StreamReader sr = new StreamReader(scriptPath)) - { - while ((line = sr.ReadLine()) != null) - { - array.Add(line); - } - } - - return array.ToArray(); - } - */ - - private static void ReadConfigValues() - { - LauncherFuncs.ReadConfigValues(GlobalVars.ConfigDir + "\\config.ini"); - } - - public static void GenerateScriptForClient(ScriptType type, string client) - { - //next, generate the header functions. - - ReadConfigValues(); - - //string scriptcontents = MultiLine(GetScriptContents(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua")); - - string code = GlobalVars.MultiLine( - "--Load Script", - //scriptcontents, - "dofile('rbxasset://scripts/" + GlobalVars.ScriptName + ".lua')", - GetScriptFuncForType(type, client) - ); - - List list = new List(Regex.Split(code, Environment.NewLine)); - string[] convertedList = list.ToArray(); - File.WriteAllLines(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptGenName + ".lua", convertedList); - } - - // using this for a possible 2006 preset feature?? - - /* - public static string GeneratePlayerColorPresetString(int preset) - { - int HeadColor = 0; - int TorsoColor = 0; - int LArmColor = 0; - int RArmColor = 0; - int LLegColor = 0; - int RLegColor = 0; - - if (preset == 1) - { - HeadColor = 24; - TorsoColor = 194; - LArmColor = 24; - RArmColor = 24; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 2) - { - HeadColor = 24; - TorsoColor = 22; - LArmColor = 24; - RArmColor = 24; - LLegColor = 9; - RLegColor = 9; - } - else if (preset == 3) - { - HeadColor = 24; - TorsoColor = 23; - LArmColor = 24; - RArmColor = 24; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 4) - { - HeadColor = 24; - TorsoColor = 22; - LArmColor = 24; - RArmColor = 24; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 5) - { - HeadColor = 24; - TorsoColor = 11; - LArmColor = 24; - RArmColor = 24; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 6) - { - HeadColor = 38; - TorsoColor = 194; - LArmColor = 38; - RArmColor = 38; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 7) - { - HeadColor = 128; - TorsoColor = 119; - LArmColor = 128; - RArmColor = 128; - LLegColor = 119; - RLegColor = 119; - } - else if (preset == 8) - { - HeadColor = 9; - TorsoColor = 194; - LArmColor = 9; - RArmColor = 9; - LLegColor = 119; - RLegColor = 119; - } - - string output = MultiLine( - "--Color Settings", - "HeadColorID = " + HeadColor, - "TorsoColorID = " + TorsoColor, - "LeftArmColorID = " + LArmColor, - "RightArmColorID = " + RArmColor, - "LeftLegColorID = " + LLegColor, - "RightLegColorID = " + RLegColor - ); - - return output; - } - */ - } - - public class ClientScript - { - private static string basedir = "rbxasset://../../../shareddata/charcustom/"; - private static string basemapdir = "rbxasset://../../../maps/"; - private static string hatdir = basedir + "hats/"; - private static string facedir = basedir + "faces/"; - private static string headdir = basedir + "heads/"; - private static string tshirtdir = basedir + "tshirts/"; - private static string shirtdir = basedir + "shirts/"; - private static string pantsdir = basedir + "pants/"; - private static string extradir = basedir + "custom/"; - - public static string GetArgsFromTag(string code, string tag, string endtag) - { - int pFrom = code.IndexOf(tag) + tag.Length; - int pTo = code.LastIndexOf(endtag); - - string result = code.Substring(pFrom, pTo - pFrom); - - return result; - } - - public static ScriptGenerator.ScriptType GetTypeFromTag(string tag, string endtag) - { - if (tag.Contains("client") && endtag.Contains("client")) - { - return ScriptGenerator.ScriptType.Client; - } - else if (tag.Contains("server") && endtag.Contains("server") || tag.Contains("no3d") && endtag.Contains("no3d")) - { - return ScriptGenerator.ScriptType.Server; - } - else if (tag.Contains("solo") && endtag.Contains("solo")) - { - return ScriptGenerator.ScriptType.Solo; - } - else if (tag.Contains("studio") && endtag.Contains("studio")) - { - return ScriptGenerator.ScriptType.Studio; - } - else - { - return ScriptGenerator.ScriptType.None; - } - } - - public static string GetRawArgsForType(ScriptGenerator.ScriptType type, string md5s, string luafile) - { - if (type == ScriptGenerator.ScriptType.Client) - { - if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) - { - return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) - { - return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) - { - return "dofile('" + luafile + "'); _G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false) - { - return "dofile('" + luafile + "'); _G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; - } - else - { - return "dofile('" + luafile + "'); _G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; - } - } - else if (type == ScriptGenerator.ScriptType.Server) - { - return "dofile('" + luafile + "'); _G.CSServer(" + GlobalVars.RobloxPort + "," + GlobalVars.PlayerLimit + "," + md5s + ")"; - } - else if (type == ScriptGenerator.ScriptType.Solo) - { - if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) - { - return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) - { - return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'Player'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) - { - return "dofile('" + luafile + "'); _G.CSSolo(0,'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false ) - { - return "dofile('" + luafile + "'); _G.CSSolo(0,'Player'," + GlobalVars.sololoadtext + ")"; - } - else - { - return "dofile('" + luafile + "'); _G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; - } - } - else if (type == ScriptGenerator.ScriptType.Studio) - { - return "dofile('" + luafile + "');"; - } - else - { - return ""; - } - } - - public static string GetRawArgsFromTag(string tag, string endtag, string md5s, string luafile) - { - return GetRawArgsForType(GetTypeFromTag(tag, endtag), md5s, luafile); - } - - public static int ConvertIconStringToInt() - { - if (GlobalVars.Custom_Icon_Offline == "BC") - { - return 1; - } - else if (GlobalVars.Custom_Icon_Offline == "TBC") - { - return 2; - } - else if (GlobalVars.Custom_Icon_Offline == "OBC") - { - return 3; - } - else if (GlobalVars.Custom_Icon_Offline == "NBC") - { - return 0; - } - - return 0; - } - - public static string GetFolderAndMapName(string source, string seperator = " -") - { - try - { - string result = source.Substring(0, source.IndexOf(seperator)); - - if (File.Exists(GlobalVars.MapsDir + @"\\" + result + @"\\" + source)) - { - return result + @"\\" + source; - } - else - { - return ""; - } - } - catch (Exception) - { - return ""; - } - } - - public static string CompileScript(string code, string tag, string endtag, string mapfile, string luafile, string rbxexe) - { - if (GlobalVars.FixScriptMapMode) - { - ScriptGenerator.GenerateScriptForClient(GetTypeFromTag(tag, endtag), GlobalVars.SelectedClient); - } - - string extractedCode = GetArgsFromTag(code, tag, endtag); - - string md5dir = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(Assembly.GetExecutingAssembly().Location) : ""; - string md5script = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua") : ""; - string md5exe = GlobalVars.AlreadyHasSecurity != true ? SecurityFuncs.CalculateMD5(rbxexe) : ""; - string md5s = "'" + md5exe + "','" + md5dir + "','" + md5script + "'"; - string compiled = extractedCode.Replace("%mapfile%",mapfile) - .Replace("%luafile%",luafile) - .Replace("%charapp%",GlobalVars.CharacterID) - .Replace("%ip%",GlobalVars.IP) - .Replace("%port%",GlobalVars.RobloxPort.ToString()) - .Replace("%name%",GlobalVars.PlayerName) - .Replace("%icone%",ConvertIconStringToInt().ToString()) - .Replace("%icon%",GlobalVars.Custom_Icon_Offline) - .Replace("%id%",GlobalVars.UserID.ToString()) - .Replace("%face%",GlobalVars.Custom_Face_Offline) - .Replace("%head%",GlobalVars.Custom_Head_Offline) - .Replace("%tshirt%",GlobalVars.Custom_T_Shirt_Offline) - .Replace("%shirt%",GlobalVars.Custom_Shirt_Offline) - .Replace("%pants%",GlobalVars.Custom_Pants_Offline) - .Replace("%hat1%",GlobalVars.Custom_Hat1ID_Offline) - .Replace("%hat2%",GlobalVars.Custom_Hat2ID_Offline) - .Replace("%hat3%",GlobalVars.Custom_Hat3ID_Offline) - .Replace("%faced%",facedir + GlobalVars.Custom_Face_Offline) - .Replace("%headd%",headdir + GlobalVars.Custom_Head_Offline) - .Replace("%tshirtd%",tshirtdir + GlobalVars.Custom_T_Shirt_Offline) - .Replace("%shirtd%",shirtdir + GlobalVars.Custom_Shirt_Offline) - .Replace("%pantsd%",pantsdir + GlobalVars.Custom_Pants_Offline) - .Replace("%hat1d%",hatdir + GlobalVars.Custom_Hat1ID_Offline) - .Replace("%hat2d%",hatdir + GlobalVars.Custom_Hat2ID_Offline) - .Replace("%hat3d%",hatdir + GlobalVars.Custom_Hat3ID_Offline) - .Replace("%headcolor%",GlobalVars.HeadColorID.ToString()) - .Replace("%torsocolor%",GlobalVars.TorsoColorID.ToString()) - .Replace("%larmcolor%",GlobalVars.LeftArmColorID.ToString()) - .Replace("%llegcolor%",GlobalVars.LeftLegColorID.ToString()) - .Replace("%rarmcolor%",GlobalVars.RightArmColorID.ToString()) - .Replace("%rlegcolor%",GlobalVars.RightLegColorID.ToString()) - .Replace("%rlegcolor%",GlobalVars.SelectedClientMD5) - .Replace("%md5launcher%",md5dir) - .Replace("%md5script%",GlobalVars.SelectedClientMD5) - .Replace("%md5exe%",GlobalVars.SelectedClientScriptMD5) - .Replace("%md5scriptd%",md5script) - .Replace("%md5exed%",md5exe) - .Replace("%limit%",GlobalVars.PlayerLimit.ToString()) - .Replace("%extra%",GlobalVars.Custom_Extra) - .Replace("%extrad%",extradir + GlobalVars.Custom_Extra) - .Replace("%hat4d%",hatdir + GlobalVars.Custom_Extra) - .Replace("%args%",GetRawArgsFromTag(tag, endtag, md5s, luafile)) - .Replace("%facews%",GlobalVars.WebServer_FaceDir + GlobalVars.Custom_Face_Offline) - .Replace("%headws%",GlobalVars.WebServer_HeadDir + GlobalVars.Custom_Head_Offline) - .Replace("%tshirtws%",GlobalVars.WebServer_TShirtDir + GlobalVars.Custom_T_Shirt_Offline) - .Replace("%shirtws%",GlobalVars.WebServer_ShirtDir + GlobalVars.Custom_Shirt_Offline) - .Replace("%pantsws%",GlobalVars.WebServer_PantsDir + GlobalVars.Custom_Pants_Offline) - .Replace("%hat1ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat1ID_Offline) - .Replace("%hat2ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat2ID_Offline) - .Replace("%hat3ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Hat3ID_Offline) - .Replace("%extraws%",GlobalVars.WebServer_ExtraDir + GlobalVars.Custom_Extra) - .Replace("%hat4ws%",GlobalVars.WebServer_HatDir + GlobalVars.Custom_Extra) - .Replace("%bodycolors%",GlobalVars.WebServer_BodyColors) - .Replace("%mapfiled%",basemapdir + GetFolderAndMapName(GlobalVars.Map)); - return compiled; - } - } - - public static class TreeNodeHelper - { - public static void ListDirectory(TreeView treeView, string path) - { - treeView.Nodes.Clear(); - var rootDirectoryInfo = new DirectoryInfo(path); - treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); - } - - public static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) - { - var directoryNode = new TreeNode(directoryInfo.Name); - foreach (var directory in directoryInfo.GetDirectories()) - directoryNode.Nodes.Add(CreateDirectoryNode(directory)); - foreach (var file in directoryInfo.GetFiles()) - directoryNode.Nodes.Add(new TreeNode(file.Name)); - return directoryNode; - } - - public static TreeNode SearchTreeView(string p_sSearchTerm, TreeNodeCollection p_Nodes) - { - foreach (TreeNode node in p_Nodes) - { - if (node.Text == p_sSearchTerm) - return node; - - if (node.Nodes.Count > 0) - { - TreeNode child = SearchTreeView(p_sSearchTerm, node.Nodes); - if (child != null) return child; - } - } - - return null; - } - - public static string GetFolderNameFromPrefix(string source, string seperator = " -") - { - try - { - string result = source.Substring(0, source.IndexOf(seperator)); - - if (Directory.Exists(GlobalVars.MapsDir + @"\\" + result)) - { - return result + @"\\"; - } - else - { - return ""; - } - } - catch (Exception) - { - return ""; - } - } - - public static void CopyNodes(TreeNodeCollection oldcollection, TreeNodeCollection newcollection) - { - foreach(TreeNode node in oldcollection) - { - newcollection.Add((TreeNode)node.Clone()); - } - } - - public static List GetAllNodes(this TreeView _self) - { - List result = new List(); - foreach (TreeNode child in _self.Nodes) - { - result.AddRange(child.GetAllNodes()); - } - return result; - } - - public static List GetAllNodes(this TreeNode _self) - { - List result = new List(); - result.Add(_self); - foreach (TreeNode child in _self.Nodes) - { - result.AddRange(child.GetAllNodes()); - } - return result; - } - } - - public static class UPnP - { - public static void InitUPnP(EventHandler DeviceFound, EventHandler DeviceLost) - { - if (GlobalVars.UPnP == true) - { - NatUtility.DeviceFound += DeviceFound; - NatUtility.DeviceLost += DeviceLost; - NatUtility.StartDiscovery(); - } - } - - public static void StartUPnP(INatDevice device, Protocol protocol, int port) - { - if (GlobalVars.UPnP == true) - { - int map = device.GetSpecificMapping(protocol, port).PublicPort; - - if (map == -1) - { - device.CreatePortMap(new Mapping(protocol, port, port)); - } - } - } - - public static void StopUPnP(INatDevice device, Protocol protocol, int port) - { - if (GlobalVars.UPnP == true) - { - int map = device.GetSpecificMapping(protocol, port).PublicPort; - - if (map != -1) - { - device.DeletePortMap(new Mapping(protocol, port, port)); - } - } - } - } - - public static class StringExtensions - { - public static bool Contains(this string source, string toCheck, StringComparison comp) - { - if (source == null) return false; - return source.IndexOf(toCheck, comp) >= 0; - } - } - - //credit to BLaZiNiX - public class IniFile - { - public string path; - - [DllImport("kernel32")] - private static extern long WritePrivateProfileString(string section, - string key,string val,string filePath); - [DllImport("kernel32")] - private static extern int GetPrivateProfileString(string section, - string key,string def, StringBuilder retVal, - int size,string filePath); - - /// - /// INIFile Constructor. - /// - /// - public IniFile(string INIPath) - { - path = INIPath; - } - /// - /// Write Data to the INI File - /// - /// - /// Section name - /// - /// Key Name - /// - /// Value Name - public void IniWriteValue(string Section,string Key,string Value) - { - WritePrivateProfileString(Section,Key,Value,this.path); - } - - /// - /// Read Data Value From the Ini File - /// - /// - /// - /// - /// - public string IniReadValue(string Section,string Key) - { - StringBuilder temp = new StringBuilder(255); - int i = GetPrivateProfileString(Section,Key,"",temp, - 255, this.path); - return temp.ToString(); - - } - } - - public static class SplashReader - { - private static string RandomSplash() - { - string[] splashes = File.ReadAllLines(GlobalVars.ConfigDir + "\\splashes.txt"); - string splash = ""; - - try - { - splash = splashes[new CryptoRandom().Next(0,splashes.Length-1)]; - } - catch (Exception) - { - try - { - splash = splashes[0]; - } - catch (Exception) - { - splash = "missingno"; - return splash; - } - } - - string formattedsplash = splash.Replace("%name%",GlobalVars.PlayerName); - - return formattedsplash; - } - - private static bool IsTheSameDay(DateTime date1, DateTime date2) - { - return (date1.Month == date2.Month && date1.Day == date2.Day); - } - - public static string GetSplash() - { - DateTime today = DateTime.Now; - string splash = ""; - - if (IsTheSameDay(today, new DateTime(today.Year,12,24)) || IsTheSameDay(today, new DateTime(today.Year,12,25))) - { - splash = "Merry Christmas!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,12,31)) || IsTheSameDay(today, new DateTime(today.Year,1,1))) - { - splash = "Happy New Year!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,10,31))) - { - splash = "Happy Halloween!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,6,10))) - { - splash = "Happy Birthday, Bitl!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,8,27))) - { - splash = "Happy Birthday, ROBLOX!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,10,27))) - { - splash = "Happy Birthday, Novetus!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,1,28))) - { - splash = "Happy Birthday, Tytygigas!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,2,15))) - { - splash = "Happy Birthday, Carrot!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,6,14))) - { - splash = "Happy Birthday, MAO!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,9,15))) - { - splash = "Happy Birthday, Coke!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,5,17))) - { - splash = "Happy Birthday, TheLivingBee!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,10,9))) - { - splash = "Happy Leif Erikson Day! HINGA DINGA DURGEN!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,10,10))) - { - splash = "I used to wonder what friendship could be!"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,4,20))) - { - splash = "4/20 lol"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,4,27))) - { - splash = "fluttershy is best pone"; - } - else if (IsTheSameDay(today, new DateTime(today.Year,2,11))) - { - splash = "RIP Erik Cassel"; - } - else - { - splash = RandomSplash(); - } - - return splash; - } - } - - //made by aksakalli - public class SimpleHTTPServer - { - - private readonly string[] _indexFiles = { - "index.html", - "index.htm", - "index.php", - "default.html", - "default.htm", - "default.php" - }; - - private static IDictionary _mimeTypeMappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { - {".asf", "video/x-ms-asf"}, - {".asx", "video/x-ms-asf"}, - {".avi", "video/x-msvideo"}, - {".bin", "application/octet-stream"}, - {".cco", "application/x-cocoa"}, - {".crt", "application/x-x509-ca-cert"}, - {".css", "text/css"}, - {".deb", "application/octet-stream"}, - {".der", "application/x-x509-ca-cert"}, - {".dll", "application/octet-stream"}, - {".dmg", "application/octet-stream"}, - {".ear", "application/java-archive"}, - {".eot", "application/octet-stream"}, - {".exe", "application/octet-stream"}, - {".flv", "video/x-flv"}, - {".gif", "image/gif"}, - {".hqx", "application/mac-binhex40"}, - {".htc", "text/x-component"}, - {".htm", "text/html"}, - {".html", "text/html"}, - {".ico", "image/x-icon"}, - {".img", "application/octet-stream"}, - {".iso", "application/octet-stream"}, - {".jar", "application/java-archive"}, - {".jardiff", "application/x-java-archive-diff"}, - {".jng", "image/x-jng"}, - {".jnlp", "application/x-java-jnlp-file"}, - {".jpeg", "image/jpeg"}, - {".jpg", "image/jpeg"}, - {".js", "application/x-javascript"}, - {".mml", "text/mathml"}, - {".mng", "video/x-mng"}, - {".mov", "video/quicktime"}, - {".mp3", "audio/mpeg"}, - {".mpeg", "video/mpeg"}, - {".mpg", "video/mpeg"}, - {".msi", "application/octet-stream"}, - {".msm", "application/octet-stream"}, - {".msp", "application/octet-stream"}, - {".pdb", "application/x-pilot"}, - {".pdf", "application/pdf"}, - {".pem", "application/x-x509-ca-cert"}, - {".php", "text/html"}, - {".pl", "application/x-perl"}, - {".pm", "application/x-perl"}, - {".png", "image/png"}, - {".prc", "application/x-pilot"}, - {".ra", "audio/x-realaudio"}, - {".rar", "application/x-rar-compressed"}, - {".rpm", "application/x-redhat-package-manager"}, - {".rss", "text/xml"}, - {".run", "application/x-makeself"}, - {".sea", "application/x-sea"}, - {".shtml", "text/html"}, - {".sit", "application/x-stuffit"}, - {".swf", "application/x-shockwave-flash"}, - {".tcl", "application/x-tcl"}, - {".tk", "application/x-tcl"}, - {".txt", "text/plain"}, - {".war", "application/java-archive"}, - {".wbmp", "image/vnd.wap.wbmp"}, - {".wmv", "video/x-ms-wmv"}, - {".xml", "text/xml"}, - {".xpi", "application/x-xpinstall"}, - {".zip", "application/zip"}, - }; - private Thread _serverThread; - private string _rootDirectory; - private HttpListener _listener; - private int _port; - - public int Port - { - get { return _port; } - private set { } - } - - /// - /// Construct server with given port. - /// - /// Directory path to serve. - /// Port of the server. - public SimpleHTTPServer(string path, int port) - { - this.Initialize(path, port); - } - - /// - /// Construct server with suitable port. - /// - /// Directory path to serve. - public SimpleHTTPServer(string path) - { - //get an empty port - TcpListener l = new TcpListener(IPAddress.Loopback, 0); - l.Start(); - int port = ((IPEndPoint)l.LocalEndpoint).Port; - l.Stop(); - this.Initialize(path, port); - } - - /// - /// Stop server and dispose all functions. - /// - public void Stop() - { - _serverThread.Abort(); - _listener.Stop(); - GlobalVars.IsWebServerOn = false; - } - - private void Listen() - { - _listener = new HttpListener(); - _listener.Prefixes.Add("http://*:" + _port.ToString() + "/"); - _listener.Start(); - while (true) - { - try - { - HttpListenerContext context = _listener.GetContext(); - Process(context); - } - catch (Exception) - { - - } - } - } - - private string ProcessPhpPage(string phpCompilerPath, string pageFileName) - { - Process proc = new Process(); - proc.StartInfo.FileName = phpCompilerPath; - proc.StartInfo.Arguments = "-d \"display_errors=1\" -d \"error_reporting=E_PARSE\" \"" + pageFileName + "\""; - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardOutput = true; - proc.StartInfo.RedirectStandardError = true; - proc.Start(); - string res = proc.StandardOutput.ReadToEnd(); - proc.StandardOutput.Close(); - proc.Close(); - return res; - } - - private void Process(HttpListenerContext context) - { - string filename = context.Request.Url.AbsolutePath; - filename = filename.Substring(1); - - if (string.IsNullOrEmpty(filename)) - { - foreach (string indexFile in _indexFiles) - { - if (File.Exists(Path.Combine(_rootDirectory, indexFile))) - { - filename = indexFile; - break; - } - } - } - - filename = Path.Combine(_rootDirectory, filename); - - if (File.Exists(filename)) - { - try - { - var ext = new FileInfo(filename); - - if (ext.Extension == ".php") - { - string output = ProcessPhpPage(GlobalVars.ConfigDir + "\\php\\php.exe", filename); - byte[] input = ASCIIEncoding.UTF8.GetBytes(output); - //Adding permanent http response headers - string mime; - context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream"; - context.Response.ContentLength64 = input.Length; - context.Response.AddHeader("Date", DateTime.Now.ToString("r")); - context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); - context.Response.OutputStream.Write(input, 0, input.Length); - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Flush(); - } - else - { - Stream input = new FileStream(filename, FileMode.Open); - //Adding permanent http response headers - string mime; - context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream"; - context.Response.ContentLength64 = input.Length; - context.Response.AddHeader("Date", DateTime.Now.ToString("r")); - context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); - - byte[] buffer = new byte[1024 * 16]; - int nbytes; - while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) - context.Response.OutputStream.Write(buffer, 0, nbytes); - input.Close(); - - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Flush(); - } - } - catch (Exception) - { - context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - } - - } - else - { - if (context.Request.HttpMethod.Equals("GET") && filename.Contains("bodycolors.rbxm", StringComparison.OrdinalIgnoreCase)) - { - string output = WebServerGenerator.GenerateBodyColorsXML(); - byte[] input = ASCIIEncoding.UTF8.GetBytes(output); - context.Response.ContentType = "text/xml"; - context.Response.ContentLength64 = input.Length; - context.Response.OutputStream.Write(input, 0, input.Length); - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Flush(); - } - else - { - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - } - } - - context.Response.OutputStream.Close(); - } - - private void Initialize(string path, int port) - { - this._rootDirectory = path; - this._port = port; - _serverThread = new Thread(this.Listen); - _serverThread.Start(); - GlobalVars.IsWebServerOn = true; - } - } - - public static class WebServerGenerator - { - public static string GenerateBodyColorsXML() - { - string xmltemplate = GlobalVars.MultiLine(File.ReadAllLines(GlobalVars.CustomPlayerDir + "\\BodyColors.xml")); - string xml = String.Format(xmltemplate, GlobalVars.HeadColorID, GlobalVars.LeftArmColorID, GlobalVars.LeftLegColorID, GlobalVars.RightArmColorID, GlobalVars.RightLegColorID, GlobalVars.TorsoColorID); - return xml; - } - } - - public static class GlobalVars - { - public static string RootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - public static string BasePath = RootPath.Replace(@"\",@"\\"); - public static string DataPath = BasePath + "\\shareddata"; - public static string ConfigDir = BasePath + "\\config"; - public static string ClientDir = BasePath + "\\clients"; - public static string MapsDir = BasePath + "\\maps"; - public static string CustomPlayerDir = DataPath + "\\charcustom"; - public static string IP = "localhost"; - public static string Version = ""; - public static string SharedArgs = ""; - public static string ScriptName = "CSMPFunctions"; - public static string ScriptGenName = "CSMPBoot"; - public static SimpleHTTPServer WebServer = null; - public static bool IsWebServerOn = false; - //vars for loader - public static bool ReadyToLaunch = false; - //server settings. - public static bool UPnP = false; - public static string Map = ""; - public static string FullMapPath = ""; - public static int RobloxPort = 53640; - public static int DefaultRobloxPort = 53640; - public static int WebServer_Port = (RobloxPort+1); - public static int PlayerLimit = 12; - //player settings - public static int UserID = 0; - public static string PlayerName = "Player"; - //launcher settings. - public static bool CloseOnLaunch = false; - public static bool LocalPlayMode = false; - //client shit - public static string SelectedClient = ""; - public static string DefaultClient = ""; - public static string DefaultMap = ""; - public static bool UsesPlayerName = false; - public static bool UsesID = true; - public static string SelectedClientDesc = ""; - public static string Warning = ""; - public static bool LegacyMode = false; - public static string SelectedClientMD5 = ""; - public static string SelectedClientScriptMD5 = ""; - public static bool FixScriptMapMode = false; - public static bool AlreadyHasSecurity = false; - public static string CustomArgs = ""; - //charcustom - public static string Custom_Hat1ID_Offline = "NoHat.rbxm"; - public static string Custom_Hat2ID_Offline = "NoHat.rbxm"; - public static string Custom_Hat3ID_Offline = "NoHat.rbxm"; - public static string Custom_Face_Offline = "DefaultFace.rbxm"; - public static string Custom_Head_Offline = "DefaultHead.rbxm"; - public static string Custom_T_Shirt_Offline = "NoTShirt.rbxm"; - public static string Custom_Shirt_Offline = "NoShirt.rbxm"; - public static string Custom_Pants_Offline = "NoPants.rbxm"; - public static string Custom_Icon_Offline = "NBC"; - public static int HeadColorID = 24; - public static int TorsoColorID = 23; - public static int LeftArmColorID = 24; - public static int RightArmColorID = 24; - public static int LeftLegColorID = 119; - public static int RightLegColorID = 119; - public static string loadtext = ""; - public static string sololoadtext = ""; - public static string CharacterID =""; - public static string Custom_Extra = "NoExtra.rbxm"; - public static bool Custom_Extra_ShowHats = false; - public static bool Custom_Extra_SelectionIsHat = false; - //color menu. - public static string ColorMenu_HeadColor = "Color [A=255, R=245, G=205, B=47]"; - public static string ColorMenu_TorsoColor = "Color [A=255, R=13, G=105, B=172]"; - public static string ColorMenu_LeftArmColor = "Color [A=255, R=245, G=205, B=47]"; - public static string ColorMenu_RightArmColor = "Color [A=255, R=245, G=205, B=47]"; - public static string ColorMenu_LeftLegColor = "Color [A=255, R=164, G=189, B=71]"; - public static string ColorMenu_RightLegColor = "Color [A=255, R=164, G=189, B=71]"; - public static bool AdminMode = false; - public static string important = ""; - //discord - public static DiscordRpc.RichPresence presence; - public static string appid = "505955125727330324"; - public static string imagekey_large = "novetus_large"; - //webserver - public static string WebServerURI = "http://" + IP + ":" + (WebServer_Port).ToString(); - public static string LocalWebServerURI = "http://localhost:" + (WebServer_Port).ToString(); - public static string WebServer_CustomPlayerDir = WebServerURI + "/charcustom/"; - public static string WebServer_HatDir = WebServer_CustomPlayerDir + "hats/"; - public static string WebServer_FaceDir = WebServer_CustomPlayerDir + "faces/"; - public static string WebServer_HeadDir = WebServer_CustomPlayerDir + "heads/"; - public static string WebServer_TShirtDir = WebServer_CustomPlayerDir + "tshirts/"; - public static string WebServer_ShirtDir = WebServer_CustomPlayerDir + "shirts/"; - public static string WebServer_PantsDir = WebServer_CustomPlayerDir + "pants/"; - public static string WebServer_ExtraDir = WebServer_CustomPlayerDir + "custom/"; - public static string WebServer_BodyColors = WebServer_CustomPlayerDir + "bodycolors.rbxm"; - //itemmaker - public static bool DisabledHelp = false; - - public static string MultiLine(params string[] args) - { - return string.Join(Environment.NewLine, args); - } - } } diff --git a/NovetusLauncher/NovetusShared/NovetusShared.csproj b/NovetusLauncher/NovetusShared/NovetusShared.csproj index d7f12fa..d7c4fa4 100644 --- a/NovetusLauncher/NovetusShared/NovetusShared.csproj +++ b/NovetusLauncher/NovetusShared/NovetusShared.csproj @@ -49,8 +49,21 @@ + + + + + + + + + + + + + diff --git a/NovetusLauncher/NovetusShared/NovetusShared.sln b/NovetusLauncher/NovetusShared/NovetusShared.sln new file mode 100644 index 0000000..77255f4 --- /dev/null +++ b/NovetusLauncher/NovetusShared/NovetusShared.sln @@ -0,0 +1,18 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +# SharpDevelop 5.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NovetusShared", "NovetusShared.csproj", "{759BFC2B-C130-4A2A-A01F-65ABFEE85B4C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {759BFC2B-C130-4A2A-A01F-65ABFEE85B4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {759BFC2B-C130-4A2A-A01F-65ABFEE85B4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {759BFC2B-C130-4A2A-A01F-65ABFEE85B4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {759BFC2B-C130-4A2A-A01F-65ABFEE85B4C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/NovetusLauncher/NovetusShared/ScriptGenerator.cs b/NovetusLauncher/NovetusShared/ScriptGenerator.cs new file mode 100644 index 0000000..6e760c5 --- /dev/null +++ b/NovetusLauncher/NovetusShared/ScriptGenerator.cs @@ -0,0 +1,276 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:02 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +/* + * so, in order for us to generate a good script, we have to: + * - specify the script header that gives us our setting adjustments + * - add player customization into the script + * - call the main script + * - call the function + * + * now, we have to call the funtion associated for the action, such as starting the main client or something + * we also need to make sure that when we add the option, we'll need to adapt map loading to work RBX2007 style for the clients using the script generator. + */ + + public class ScriptGenerator + { + public ScriptGenerator() + { + } + + public enum ScriptType + { + Client = 0, + Server = 1, + Solo = 2, + Studio = 3, + None = 4 + } + + public static string GetScriptFuncForType(ScriptType type, string client) + { + string rbxexe = ""; + if (GlobalVars.LegacyMode == true) + { + rbxexe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\clients\\" + client + @"\\RobloxApp.exe"; + } + else + { + rbxexe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\clients\\" + client + @"\\RobloxApp_client.exe"; + } + + string md5dir = SecurityFuncs.CalculateMD5(Assembly.GetExecutingAssembly().Location); + string md5script = SecurityFuncs.CalculateMD5(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua"); + string md5exe = SecurityFuncs.CalculateMD5(rbxexe); + string md5s = "'" + md5exe + "','" + md5dir + "','" + md5script + "'"; + if (type == ScriptType.Client) + { + if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) + { + return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) + { + return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) + { + return "_G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false) + { + return "_G.CSConnect(0,'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'Player'," + GlobalVars.loadtext + "," + md5s + ")"; + } + else + { + return "_G.CSConnect(" + GlobalVars.UserID + ",'" + GlobalVars.IP + "'," + GlobalVars.RobloxPort + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.loadtext + "," + md5s + ")"; + } + } + else if (type == ScriptType.Server) + { + return "_G.CSServer(" + GlobalVars.RobloxPort + "," + GlobalVars.PlayerLimit + "," + md5s + ")"; + } + else if (type == ScriptType.Solo) + { + if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == true) + { + return "_G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == true) + { + return "_G.CSSolo(" + GlobalVars.UserID + ",'Player'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == true && GlobalVars.UsesID == false) + { + return "_G.CSSolo(0,'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + else if (GlobalVars.UsesPlayerName == false && GlobalVars.UsesID == false ) + { + return "_G.CSSolo(0,'Player'," + GlobalVars.sololoadtext + ")"; + } + else + { + return "_G.CSSolo(" + GlobalVars.UserID + ",'" + GlobalVars.PlayerName + "'," + GlobalVars.sololoadtext + ")"; + } + } + else if (type == ScriptType.Studio) + { + return ""; + } + else + { + return ""; + } + } + + public static string GetNameForType(ScriptType type) + { + if (type == ScriptType.Client) + { + return "Client"; + } + else if (type == ScriptType.Server) + { + return "Server"; + } + else if (type == ScriptType.Solo) + { + return "Play Solo"; + } + else if (type == ScriptType.Studio) + { + return "Studio"; + } + else + { + return ""; + } + } + + /* + public static string[] GetScriptContents(string scriptPath) + { + List array = new List(); + string line = ""; + using (StreamReader sr = new StreamReader(scriptPath)) + { + while ((line = sr.ReadLine()) != null) + { + array.Add(line); + } + } + + return array.ToArray(); + } + */ + + private static void ReadConfigValues() + { + LauncherFuncs.ReadConfigValues(GlobalVars.ConfigDir + "\\config.ini"); + } + + public static void GenerateScriptForClient(ScriptType type, string client) + { + //next, generate the header functions. + + ReadConfigValues(); + + //string scriptcontents = MultiLine(GetScriptContents(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptName + ".lua")); + + string code = GlobalVars.MultiLine( + "--Load Script", + //scriptcontents, + "dofile('rbxasset://scripts/" + GlobalVars.ScriptName + ".lua')", + GetScriptFuncForType(type, client) + ); + + List list = new List(Regex.Split(code, Environment.NewLine)); + string[] convertedList = list.ToArray(); + File.WriteAllLines(GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptGenName + ".lua", convertedList); + } + + // using this for a possible 2006 preset feature?? + + /* + public static string GeneratePlayerColorPresetString(int preset) + { + int HeadColor = 0; + int TorsoColor = 0; + int LArmColor = 0; + int RArmColor = 0; + int LLegColor = 0; + int RLegColor = 0; + + if (preset == 1) + { + HeadColor = 24; + TorsoColor = 194; + LArmColor = 24; + RArmColor = 24; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 2) + { + HeadColor = 24; + TorsoColor = 22; + LArmColor = 24; + RArmColor = 24; + LLegColor = 9; + RLegColor = 9; + } + else if (preset == 3) + { + HeadColor = 24; + TorsoColor = 23; + LArmColor = 24; + RArmColor = 24; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 4) + { + HeadColor = 24; + TorsoColor = 22; + LArmColor = 24; + RArmColor = 24; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 5) + { + HeadColor = 24; + TorsoColor = 11; + LArmColor = 24; + RArmColor = 24; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 6) + { + HeadColor = 38; + TorsoColor = 194; + LArmColor = 38; + RArmColor = 38; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 7) + { + HeadColor = 128; + TorsoColor = 119; + LArmColor = 128; + RArmColor = 128; + LLegColor = 119; + RLegColor = 119; + } + else if (preset == 8) + { + HeadColor = 9; + TorsoColor = 194; + LArmColor = 9; + RArmColor = 9; + LLegColor = 119; + RLegColor = 119; + } + + string output = MultiLine( + "--Color Settings", + "HeadColorID = " + HeadColor, + "TorsoColorID = " + TorsoColor, + "LeftArmColorID = " + LArmColor, + "RightArmColorID = " + RArmColor, + "LeftLegColorID = " + LLegColor, + "RightLegColorID = " + RLegColor + ); + + return output; + } + */ + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/SecurityFuncs.cs b/NovetusLauncher/NovetusShared/SecurityFuncs.cs new file mode 100644 index 0000000..360fdbf --- /dev/null +++ b/NovetusLauncher/NovetusShared/SecurityFuncs.cs @@ -0,0 +1,215 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 6:59 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +/// + /// Description of SecurityFuncs. + /// + public class SecurityFuncs + { + [DllImport("user32.dll")] + static extern int SetWindowText(IntPtr hWnd, string text); + + public SecurityFuncs() + { + } + + public static string RandomString(int length) + { + CryptoRandom random = new CryptoRandom(); + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; + return new string(Enumerable.Repeat(chars, length) + .Select(s => s[random.Next(s.Length)]).ToArray()); + } + + public static string RandomString() + { + CryptoRandom random = new CryptoRandom(); + return RandomString(random.Next(5, 20)); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static bool IsBase64String(string s) + { + s = s.Trim(); + return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None); + } + + public static void RegisterURLProtocol(string protocolName, string applicationPath, string description) + { + RegistryKey subKey = Registry.ClassesRoot.CreateSubKey(protocolName); + subKey.SetValue((string) null, (object) description); + subKey.SetValue("URL Protocol", (object) string.Empty); + Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell"); + Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell\\open"); + Registry.ClassesRoot.CreateSubKey(protocolName + "\\Shell\\open\\command").SetValue((string) null, (object) ("\"" + applicationPath + "\" \"%1\"")); + } + + public static long UnixTimeNow() + { + var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); + return (long)timeSpan.TotalSeconds; + } + + public static bool checkClientMD5(string client) + { + if (GlobalVars.AdminMode != true) + { + if (GlobalVars.AlreadyHasSecurity != true) + { + string rbxexe = ""; + if (GlobalVars.LegacyMode == true) + { + rbxexe = GlobalVars.BasePath + "\\clients\\" + client + "\\RobloxApp.exe"; + } + else + { + rbxexe = GlobalVars.BasePath + "\\clients\\" + client + "\\RobloxApp_client.exe"; + } + using (var md5 = MD5.Create()) + { + using (var stream = File.OpenRead(rbxexe)) + { + byte[] hash = md5.ComputeHash(stream); + string clientMD5 = BitConverter.ToString(hash).Replace("-", ""); + if (clientMD5.Equals(GlobalVars.SelectedClientMD5)) + { + return true; + } + else + { + return false; + } + } + } + } + else + { + return true; + } + } + else + { + return true; + } + } + + public static bool checkScriptMD5(string client) + { + if (GlobalVars.AdminMode != true) + { + if (GlobalVars.AlreadyHasSecurity != true) + { + string rbxscript = GlobalVars.BasePath + "\\clients\\" + client + "\\content\\scripts\\" + GlobalVars.ScriptName + ".lua"; + using (var md5 = MD5.Create()) + { + using (var stream = File.OpenRead(rbxscript)) + { + byte[] hash = md5.ComputeHash(stream); + string clientMD5 = BitConverter.ToString(hash).Replace("-", ""); + if (clientMD5.Equals(GlobalVars.SelectedClientScriptMD5)) + { + return true; + } + else + { + return false; + } + } + } + } + else + { + return true; + } + } + else + { + return true; + } + } + + public static string CalculateMD5(string filename) + { + using (var md5 = MD5.Create()) + { + using (var stream = File.OpenRead(filename)) + { + return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-",""); + } + } + } + + public static bool IsElevated + { + get + { + return WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid); + } + } + + public static string RandomStringTitle() + { + CryptoRandom random = new CryptoRandom(); + return new String(' ', random.Next(20)); + } + + public static void RenameWindow(Process exe, ScriptGenerator.ScriptType type) + { + if (GlobalVars.AlreadyHasSecurity != true) + { + int time = 500; + BackgroundWorker worker = new BackgroundWorker(); + worker.DoWork += (obj, e) => WorkerDoWork(exe, type, time, worker, GlobalVars.SelectedClient); + worker.RunWorkerAsync(); + } + } + + private static void WorkerDoWork(Process exe, ScriptGenerator.ScriptType type, int time, BackgroundWorker worker, string clientname) + { + if (exe.IsRunning() == true) + { + while (exe.IsRunning() == true) + { + if (exe.IsRunning() != true) + { + worker.DoWork -= (obj, e) => WorkerDoWork(exe, type, time, worker, clientname); + worker.CancelAsync(); + worker.Dispose(); + break; + } + + if (type == ScriptGenerator.ScriptType.Client) + { + SetWindowText(exe.MainWindowHandle, "Novetus " + GlobalVars.Version + " - " + clientname + " " + ScriptGenerator.GetNameForType(type) + " [" + GlobalVars.IP + ":" + GlobalVars.RobloxPort + "]" + RandomStringTitle()); + } + else if (type == ScriptGenerator.ScriptType.Server || type == ScriptGenerator.ScriptType.Solo || type == ScriptGenerator.ScriptType.Studio) + { + SetWindowText(exe.MainWindowHandle, "Novetus " + GlobalVars.Version + " - " + clientname + " " + ScriptGenerator.GetNameForType(type) + " [" + GlobalVars.Map + "]" + RandomStringTitle()); + } + Thread.Sleep(time); + } + } + else + { + Thread.Sleep(time); + RenameWindow(exe, type); + } + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/SplashReader.cs b/NovetusLauncher/NovetusShared/SplashReader.cs new file mode 100644 index 0000000..4b21b84 --- /dev/null +++ b/NovetusLauncher/NovetusShared/SplashReader.cs @@ -0,0 +1,116 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:04 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class SplashReader + { + private static string RandomSplash() + { + string[] splashes = File.ReadAllLines(GlobalVars.ConfigDir + "\\splashes.txt"); + string splash = ""; + + try + { + splash = splashes[new CryptoRandom().Next(0,splashes.Length-1)]; + } + catch (Exception) + { + try + { + splash = splashes[0]; + } + catch (Exception) + { + splash = "missingno"; + return splash; + } + } + + string formattedsplash = splash.Replace("%name%",GlobalVars.PlayerName); + + return formattedsplash; + } + + private static bool IsTheSameDay(DateTime date1, DateTime date2) + { + return (date1.Month == date2.Month && date1.Day == date2.Day); + } + + public static string GetSplash() + { + DateTime today = DateTime.Now; + string splash = ""; + + if (IsTheSameDay(today, new DateTime(today.Year,12,24)) || IsTheSameDay(today, new DateTime(today.Year,12,25))) + { + splash = "Merry Christmas!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,12,31)) || IsTheSameDay(today, new DateTime(today.Year,1,1))) + { + splash = "Happy New Year!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,10,31))) + { + splash = "Happy Halloween!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,6,10))) + { + splash = "Happy Birthday, Bitl!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,8,27))) + { + splash = "Happy Birthday, ROBLOX!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,10,27))) + { + splash = "Happy Birthday, Novetus!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,2,15))) + { + splash = "Happy Birthday, Carrot!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,6,14))) + { + splash = "Happy Birthday, MAO!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,9,15))) + { + splash = "Happy Birthday, Coke!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,5,17))) + { + splash = "Happy Birthday, TheLivingBee!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,10,9))) + { + splash = "Happy Leif Erikson Day! HINGA DINGA DURGEN!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,10,10))) + { + splash = "I used to wonder what friendship could be!"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,4,20))) + { + splash = "4/20 lol"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,4,27))) + { + splash = "fluttershy is best pone"; + } + else if (IsTheSameDay(today, new DateTime(today.Year,2,11))) + { + splash = "RIP Erik Cassel"; + } + else + { + splash = RandomSplash(); + } + + return splash; + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/TextLineRemover.cs b/NovetusLauncher/NovetusShared/TextLineRemover.cs new file mode 100644 index 0000000..245aa83 --- /dev/null +++ b/NovetusLauncher/NovetusShared/TextLineRemover.cs @@ -0,0 +1,97 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 6:59 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class TextLineRemover + { + public static void RemoveTextLines(IList linesToRemove, string filename, string tempFilename) + { + // Initial values + int lineNumber = 0; + int linesRemoved = 0; + DateTime startTime = DateTime.Now; + + // Read file + using (var sr = new StreamReader(filename)) + { + // Write new file + using (var sw = new StreamWriter(tempFilename)) + { + // Read lines + string line; + while ((line = sr.ReadLine()) != null) + { + lineNumber++; + // Look for text to remove + if (!ContainsString(line, linesToRemove)) + { + // Keep lines that does not match + sw.WriteLine(line); + } + else + { + // Ignore lines that DO match + linesRemoved++; + InvokeOnRemovedLine(new RemovedLineArgs { RemovedLine = line, RemovedLineNumber = lineNumber}); + } + } + } + } + // Delete original file + File.Delete(filename); + + // ... and put the temp file in its place. + File.Move(tempFilename, filename); + + // Final calculations + DateTime endTime = DateTime.Now; + InvokeOnFinished(new FinishedArgs {LinesRemoved = linesRemoved, TotalLines = lineNumber, TotalTime = endTime.Subtract(startTime)}); + } + + private static bool ContainsString(string line, IEnumerable linesToRemove) + { + foreach (var lineToRemove in linesToRemove) + { + if(line.Contains(lineToRemove)) + return true; + } + return false; + } + + public static event RemovedLine OnRemovedLine; + public static event Finished OnFinished; + + public static void InvokeOnFinished(FinishedArgs args) + { + Finished handler = OnFinished; + if (handler != null) handler(null, args); + } + + public static void InvokeOnRemovedLine(RemovedLineArgs args) + { + RemovedLine handler = OnRemovedLine; + if (handler != null) handler(null, args); + } + } + + public delegate void Finished(object sender, FinishedArgs args); + + public class FinishedArgs + { + public int TotalLines { get; set; } + public int LinesRemoved { get; set; } + public TimeSpan TotalTime { get; set; } + } + + public delegate void RemovedLine(object sender, RemovedLineArgs args); + + public class RemovedLineArgs + { + public string RemovedLine { get; set; } + public int RemovedLineNumber { get; set; } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/TreeNodeHelper.cs b/NovetusLauncher/NovetusShared/TreeNodeHelper.cs new file mode 100644 index 0000000..1e5b3e3 --- /dev/null +++ b/NovetusLauncher/NovetusShared/TreeNodeHelper.cs @@ -0,0 +1,95 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:03 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class TreeNodeHelper + { + public static void ListDirectory(TreeView treeView, string path) + { + treeView.Nodes.Clear(); + var rootDirectoryInfo = new DirectoryInfo(path); + treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); + } + + public static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) + { + var directoryNode = new TreeNode(directoryInfo.Name); + foreach (var directory in directoryInfo.GetDirectories()) + directoryNode.Nodes.Add(CreateDirectoryNode(directory)); + foreach (var file in directoryInfo.GetFiles()) + directoryNode.Nodes.Add(new TreeNode(file.Name)); + return directoryNode; + } + + public static TreeNode SearchTreeView(string p_sSearchTerm, TreeNodeCollection p_Nodes) + { + foreach (TreeNode node in p_Nodes) + { + if (node.Text == p_sSearchTerm) + return node; + + if (node.Nodes.Count > 0) + { + TreeNode child = SearchTreeView(p_sSearchTerm, node.Nodes); + if (child != null) return child; + } + } + + return null; + } + + public static string GetFolderNameFromPrefix(string source, string seperator = " -") + { + try + { + string result = source.Substring(0, source.IndexOf(seperator)); + + if (Directory.Exists(GlobalVars.MapsDir + @"\\" + result)) + { + return result + @"\\"; + } + else + { + return ""; + } + } + catch (Exception) + { + return ""; + } + } + + public static void CopyNodes(TreeNodeCollection oldcollection, TreeNodeCollection newcollection) + { + foreach(TreeNode node in oldcollection) + { + newcollection.Add((TreeNode)node.Clone()); + } + } + + public static List GetAllNodes(this TreeView _self) + { + List result = new List(); + foreach (TreeNode child in _self.Nodes) + { + result.AddRange(child.GetAllNodes()); + } + return result; + } + + public static List GetAllNodes(this TreeNode _self) + { + List result = new List(); + result.Add(_self); + foreach (TreeNode child in _self.Nodes) + { + result.AddRange(child.GetAllNodes()); + } + return result; + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/UPnP.cs b/NovetusLauncher/NovetusShared/UPnP.cs new file mode 100644 index 0000000..9623bc6 --- /dev/null +++ b/NovetusLauncher/NovetusShared/UPnP.cs @@ -0,0 +1,47 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:03 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +public static class UPnP + { + public static void InitUPnP(EventHandler DeviceFound, EventHandler DeviceLost) + { + if (GlobalVars.UPnP == true) + { + NatUtility.DeviceFound += DeviceFound; + NatUtility.DeviceLost += DeviceLost; + NatUtility.StartDiscovery(); + } + } + + public static void StartUPnP(INatDevice device, Protocol protocol, int port) + { + if (GlobalVars.UPnP == true) + { + int map = device.GetSpecificMapping(protocol, port).PublicPort; + + if (map == -1) + { + device.CreatePortMap(new Mapping(protocol, port, port)); + } + } + } + + public static void StopUPnP(INatDevice device, Protocol protocol, int port) + { + if (GlobalVars.UPnP == true) + { + int map = device.GetSpecificMapping(protocol, port).PublicPort; + + if (map != -1) + { + device.DeletePortMap(new Mapping(protocol, port, port)); + } + } + } + } \ No newline at end of file diff --git a/NovetusLauncher/NovetusShared/WebServer.cs b/NovetusLauncher/NovetusShared/WebServer.cs new file mode 100644 index 0000000..404959e --- /dev/null +++ b/NovetusLauncher/NovetusShared/WebServer.cs @@ -0,0 +1,274 @@ +/* + * Created by SharpDevelop. + * User: Bitl + * Date: 10/10/2019 + * Time: 7:05 AM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +//made by aksakalli + public class SimpleHTTPServer + { + + private readonly string[] _indexFiles = { + "index.html", + "index.htm", + "index.php", + "default.html", + "default.htm", + "default.php" + }; + + private static IDictionary _mimeTypeMappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { + {".asf", "video/x-ms-asf"}, + {".asx", "video/x-ms-asf"}, + {".avi", "video/x-msvideo"}, + {".bin", "application/octet-stream"}, + {".cco", "application/x-cocoa"}, + {".crt", "application/x-x509-ca-cert"}, + {".css", "text/css"}, + {".deb", "application/octet-stream"}, + {".der", "application/x-x509-ca-cert"}, + {".dll", "application/octet-stream"}, + {".dmg", "application/octet-stream"}, + {".ear", "application/java-archive"}, + {".eot", "application/octet-stream"}, + {".exe", "application/octet-stream"}, + {".flv", "video/x-flv"}, + {".gif", "image/gif"}, + {".hqx", "application/mac-binhex40"}, + {".htc", "text/x-component"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".ico", "image/x-icon"}, + {".img", "application/octet-stream"}, + {".iso", "application/octet-stream"}, + {".jar", "application/java-archive"}, + {".jardiff", "application/x-java-archive-diff"}, + {".jng", "image/x-jng"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".jpeg", "image/jpeg"}, + {".jpg", "image/jpeg"}, + {".js", "application/x-javascript"}, + {".mml", "text/mathml"}, + {".mng", "video/x-mng"}, + {".mov", "video/quicktime"}, + {".mp3", "audio/mpeg"}, + {".mpeg", "video/mpeg"}, + {".mpg", "video/mpeg"}, + {".msi", "application/octet-stream"}, + {".msm", "application/octet-stream"}, + {".msp", "application/octet-stream"}, + {".pdb", "application/x-pilot"}, + {".pdf", "application/pdf"}, + {".pem", "application/x-x509-ca-cert"}, + {".php", "text/html"}, + {".pl", "application/x-perl"}, + {".pm", "application/x-perl"}, + {".png", "image/png"}, + {".prc", "application/x-pilot"}, + {".ra", "audio/x-realaudio"}, + {".rar", "application/x-rar-compressed"}, + {".rpm", "application/x-redhat-package-manager"}, + {".rss", "text/xml"}, + {".run", "application/x-makeself"}, + {".sea", "application/x-sea"}, + {".shtml", "text/html"}, + {".sit", "application/x-stuffit"}, + {".swf", "application/x-shockwave-flash"}, + {".tcl", "application/x-tcl"}, + {".tk", "application/x-tcl"}, + {".txt", "text/plain"}, + {".war", "application/java-archive"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wmv", "video/x-ms-wmv"}, + {".xml", "text/xml"}, + {".xpi", "application/x-xpinstall"}, + {".zip", "application/zip"}, + }; + private Thread _serverThread; + private string _rootDirectory; + private HttpListener _listener; + private int _port; + + public int Port + { + get { return _port; } + private set { } + } + + /// + /// Construct server with given port. + /// + /// Directory path to serve. + /// Port of the server. + public SimpleHTTPServer(string path, int port) + { + this.Initialize(path, port); + } + + /// + /// Construct server with suitable port. + /// + /// Directory path to serve. + public SimpleHTTPServer(string path) + { + //get an empty port + TcpListener l = new TcpListener(IPAddress.Loopback, 0); + l.Start(); + int port = ((IPEndPoint)l.LocalEndpoint).Port; + l.Stop(); + this.Initialize(path, port); + } + + /// + /// Stop server and dispose all functions. + /// + public void Stop() + { + _serverThread.Abort(); + _listener.Stop(); + GlobalVars.IsWebServerOn = false; + } + + private void Listen() + { + _listener = new HttpListener(); + _listener.Prefixes.Add("http://*:" + _port.ToString() + "/"); + _listener.Start(); + while (true) + { + try + { + HttpListenerContext context = _listener.GetContext(); + Process(context); + } + catch (Exception) + { + + } + } + } + + private string ProcessPhpPage(string phpCompilerPath, string pageFileName) + { + Process proc = new Process(); + proc.StartInfo.FileName = phpCompilerPath; + proc.StartInfo.Arguments = "-d \"display_errors=1\" -d \"error_reporting=E_PARSE\" \"" + pageFileName + "\""; + proc.StartInfo.CreateNoWindow = true; + proc.StartInfo.UseShellExecute = false; + proc.StartInfo.RedirectStandardOutput = true; + proc.StartInfo.RedirectStandardError = true; + proc.Start(); + string res = proc.StandardOutput.ReadToEnd(); + proc.StandardOutput.Close(); + proc.Close(); + return res; + } + + private void Process(HttpListenerContext context) + { + string filename = context.Request.Url.AbsolutePath; + filename = filename.Substring(1); + + if (string.IsNullOrEmpty(filename)) + { + foreach (string indexFile in _indexFiles) + { + if (File.Exists(Path.Combine(_rootDirectory, indexFile))) + { + filename = indexFile; + break; + } + } + } + + filename = Path.Combine(_rootDirectory, filename); + + if (File.Exists(filename)) + { + try + { + var ext = new FileInfo(filename); + + if (ext.Extension == ".php") + { + string output = ProcessPhpPage(GlobalVars.ConfigDir + "\\php\\php.exe", filename); + byte[] input = ASCIIEncoding.UTF8.GetBytes(output); + //Adding permanent http response headers + string mime; + context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream"; + context.Response.ContentLength64 = input.Length; + context.Response.AddHeader("Date", DateTime.Now.ToString("r")); + context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); + context.Response.OutputStream.Write(input, 0, input.Length); + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Flush(); + } + else + { + Stream input = new FileStream(filename, FileMode.Open); + //Adding permanent http response headers + string mime; + context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream"; + context.Response.ContentLength64 = input.Length; + context.Response.AddHeader("Date", DateTime.Now.ToString("r")); + context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); + + byte[] buffer = new byte[1024 * 16]; + int nbytes; + while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) + context.Response.OutputStream.Write(buffer, 0, nbytes); + input.Close(); + + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Flush(); + } + } + catch (Exception) + { + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + } + + } + else + { + if (context.Request.HttpMethod.Equals("GET") && filename.Contains("bodycolors.rbxm", StringComparison.OrdinalIgnoreCase)) + { + string output = WebServerGenerator.GenerateBodyColorsXML(); + byte[] input = ASCIIEncoding.UTF8.GetBytes(output); + context.Response.ContentType = "text/xml"; + context.Response.ContentLength64 = input.Length; + context.Response.OutputStream.Write(input, 0, input.Length); + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Flush(); + } + else + { + context.Response.StatusCode = (int)HttpStatusCode.NotFound; + } + } + + context.Response.OutputStream.Close(); + } + + private void Initialize(string path, int port) + { + this._rootDirectory = path; + this._port = port; + _serverThread = new Thread(this.Listen); + _serverThread.Start(); + GlobalVars.IsWebServerOn = true; + } + } + + public static class WebServerGenerator + { + public static string GenerateBodyColorsXML() + { + string xmltemplate = GlobalVars.MultiLine(File.ReadAllLines(GlobalVars.CustomPlayerDir + "\\BodyColors.xml")); + string xml = String.Format(xmltemplate, GlobalVars.HeadColorID, GlobalVars.LeftArmColorID, GlobalVars.LeftLegColorID, GlobalVars.RightArmColorID, GlobalVars.RightLegColorID, GlobalVars.TorsoColorID); + return xml; + } + } \ No newline at end of file