split launcherfuncs into seperate files part 1

This commit is contained in:
Bitl 2019-10-10 07:07:14 -07:00
parent 14448cfbce
commit c0d04a9db5
16 changed files with 1739 additions and 1611 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}
///<param name=”buffer”>An array of bytes to contain random numbers.</param>
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;
}
///<param name=”minValue”>The inclusive lower bound of the random number returned.</param>
///<param name=”maxValue”>The exclusive upper bound of the random number returned. maxValue must be greater than or equal to minValue.</param>
public int Next(int minValue, int maxValue)
{
return (int)Math.Round(NextDouble() * (maxValue - minValue - 1)) + minValue;
}
public int Next()
{
return Next(0, Int32.MaxValue);
}
///<param name=”maxValue”>The inclusive upper bound of the random number returned. maxValue must be greater than or equal 0</param>
public int Next(int maxValue)
{
return Next(0, maxValue);
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
/// <summary>
/// INIFile Constructor.
/// </summary>
/// <PARAM name="INIPath"></PARAM>
public IniFile(string INIPath)
{
path = INIPath;
}
/// <summary>
/// Write Data to the INI File
/// </summary>
/// <PARAM name="Section"></PARAM>
/// Section name
/// <PARAM name="Key"></PARAM>
/// Key Name
/// <PARAM name="Value"></PARAM>
/// Value Name
public void IniWriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.path);
}
/// <summary>
/// Read Data Value From the Ini File
/// </summary>
/// <PARAM name="Section"></PARAM>
/// <PARAM name="Key"></PARAM>
/// <PARAM name="Path"></PARAM>
/// <returns></returns>
public string IniReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,
255, this.path);
return temp.ToString();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -49,8 +49,21 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ClientScript.cs" />
<Compile Include="CodeExtensions.cs" />
<Compile Include="CryptoRandom.cs" />
<Compile Include="GlobalVars.cs" />
<Compile Include="IniFile.cs" />
<Compile Include="SplashReader.cs" />
<Compile Include="UPnP.cs" />
<Compile Include="DiscordRpc.cs" />
<Compile Include="LauncherFuncs.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ScriptGenerator.cs" />
<Compile Include="SecurityFuncs.cs" />
<Compile Include="TextLineRemover.cs" />
<Compile Include="TreeNodeHelper.cs" />
<Compile Include="WebServer.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />

View File

@ -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

View File

@ -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<string> array = new List<string>();
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<string> list = new List<string>(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;
}
*/
}

View File

@ -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.
*/
/// <summary>
/// Description of SecurityFuncs.
/// </summary>
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);
}
}
}

View File

@ -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;
}
}

View File

@ -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<string> 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<string> 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; }
}

View File

@ -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<TreeNode> GetAllNodes(this TreeView _self)
{
List<TreeNode> result = new List<TreeNode>();
foreach (TreeNode child in _self.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
public static List<TreeNode> GetAllNodes(this TreeNode _self)
{
List<TreeNode> result = new List<TreeNode>();
result.Add(_self);
foreach (TreeNode child in _self.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
}

View File

@ -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<DeviceEventArgs> DeviceFound, EventHandler<DeviceEventArgs> 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));
}
}
}
}

View File

@ -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<string, string> _mimeTypeMappings = new Dictionary<string, string>(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 { }
}
/// <summary>
/// Construct server with given port.
/// </summary>
/// <param name="path">Directory path to serve.</param>
/// <param name="port">Port of the server.</param>
public SimpleHTTPServer(string path, int port)
{
this.Initialize(path, port);
}
/// <summary>
/// Construct server with suitable port.
/// </summary>
/// <param name="path">Directory path to serve.</param>
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);
}
/// <summary>
/// Stop server and dispose all functions.
/// </summary>
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;
}
}