launcher/Form1.cs

489 lines
22 KiB
C#

using System;
using System.Text;
using IWshRuntimeLibrary;
using System.Diagnostics;
using System.Windows.Forms;
using System.Net;
using System.IO;
using DiscordRPC;
namespace ARCHBLOXLauncherGUI
{
public partial class Form1 : Form
{
private void CreateShortcut()
{
// create shortcut on user's desktop
object shDesktop = (object)"Desktop";
WshShell shell = new WshShell();
string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\ARCHBLOX Launcher.lnk";
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress);
shortcut.Description = "ARCHBLOX Player";
shortcut.TargetPath = ARCHBLOXLauncherGUI.Extensions.GetExecutablePath();
shortcut.Save();
}
// variables
bool exitafterarg = false;
bool rbxl = false;
private DiscordRpcClient client;
bool ingame = false;
bool hosting = false;
private static WebClient wc = new WebClient();
static byte[] raw = wc.DownloadData("http://archblox.com/client/version.txt");
static string webData = Encoding.UTF8.GetString(raw);
static string version_string = webData;
static string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Archblx\", @"Versions\");
static string clientPath = Path.Combine(folderPath, version_string + @"\");
static string filePath = Path.Combine(clientPath, "ArchbloxPlayerBeta.exe");
delegate void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e);
public Form1()
{
InitializeComponent();
// Check for a internet connection
try
{
wc.DownloadData("http://archblox.com/client/version.txt");
}
catch
{
MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: HttpOpenRequest failed for GET http://archblox.com/client/version.txt, Error ID: 6", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
ARCHBLOXProtocol.ARCHBLOXURIProtocol.Register();
CreateShortcut();
var lastword = "";
var info1 = "";
var info2 = "";
string[] args = ARCHBLOXProtocol.SharedVariables.Arguments.Split('/');
// check to see if uri/arguments were used
foreach (var word in args)
{
if (lastword == "host")
{
if (!System.IO.File.Exists(filePath))
{
DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client select Yes.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (res == DialogResult.Yes)
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
form2.Show();
} else
{
Environment.Exit(0);
}
}
exitafterarg = true;
lastword = "stop";
string[] info = word.Split(':');
foreach (var word2 in info)
{
if (info1 == "")
{
info1 = word2;
}
else
{
info2 = word2;
}
}
if (info1 == "" || info2 == "")
{
MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid Arguments, Error ID: 500", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
var pProcess = new Process();
hosting = true;
pProcess.StartInfo.FileName = filePath;
pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/gameserver.php?port=" + info1 + "&rbxl=" + info2 + "\" -t \"1\"";
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
pProcess.StartInfo.CreateNoWindow = false;
pProcess.Start();
MessageBox.Show("Starting game server on port " + info1 + " using " + info2, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (lastword == "join")
{
if (!System.IO.File.Exists(filePath))
{
DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (res == DialogResult.Yes)
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
form2.Show();
}
else
{
Environment.Exit(0);
}
}
exitafterarg = true;
lastword = "stop";
string[] info = word.Split(':');
foreach (var word2 in info)
{
if (info1 == "")
{
info1 = word2;
}
else
{
info2 = word2;
}
}
if (info1 == "" || info2 == "")
{
MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid Arguments, Error ID: 500", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
var pProcess = new Process();
hosting = true;
pProcess.StartInfo.FileName = filePath;
pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/join.ashx?port=" + info1 + "&ip=" + info2 + "\" -t \"1\"";
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
pProcess.StartInfo.CreateNoWindow = false;
pProcess.Start();
MessageBox.Show("Joining " + info2 + ":" + info1, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (word == "install")
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
form2.Show();
}
if (word == "") { }
else
{
lastword = word;
}
}
if (exitafterarg == true)
{
// close program
Environment.Exit(0);
}
client = new DiscordRpcClient("996030605106090006");
client.Initialize();
client.SetPresence(new RichPresence()
{
Details = "Launcher",
State = "Browsing through the menus...",
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "launcher",
SmallImageKey = "archblox",
}
});
}
private void button1_Click(object sender, EventArgs e)
{
// hosting
string phrase = textBox2.Text;
string[] words = phrase.Split('.');
string sWord = "";
foreach (var word in words)
{
sWord = word.ToLower();
if (sWord == "rbxl")
{
rbxl = true;
}
else
{
rbxl = false;
}
}
if (!System.IO.File.Exists(filePath))
{
DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes or select the Install button on the main menu.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (res == DialogResult.Yes)
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
form2.Show();
}
}
else if (textBox1.Text == "" || textBox2.Text == "")
{
MessageBox.Show("Please fill in all of the text boxes.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else if (rbxl == false)
{
MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid .RBXL, " + sWord + " is not a supported file format.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// Check if RADMIN VPN ip address to protect port forwarders from exposing their ip address and potentionally causing the server hoster to be doxxed/ddossed
string phrase2 = serverip.Text;
string[] words2 = phrase2.Split('.');
string sWord2 = "";
bool radmin = false;
foreach (var word in words2)
{
sWord2 = word.ToLower();
if (sWord2 == "26" || sWord2 == "localhost" || sWord2 == "192" || sWord2 == "10" || sWord2 == "127")
{
radmin = true;
}
else
{
radmin = false;
}
break;
}
if (radmin == false)
{
phrase2 = "[IP HIDDEN]"; // HAHAHA DUDE THESE DOXXERS AND DDOSSERS ARE SO FUCKING FUNNY THEY MAKE ME WANT TO MERGE WITHOUT LOOKING!!!!
}
void ProcessExitHandler(object sender, EventArgs args)
{
hosting = false;
if (ingame == true)
{
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Playing a Game",
State = "on " + phrase2 + ":" + serverport.Text,
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "ingame",
SmallImageKey = "archblox",
}
});
}
else
{
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Launcher",
State = "Browsing through the menus...",
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "launcher",
SmallImageKey = "archblox",
}
});
}
}
var pProcess = new Process();
hosting = true;
pProcess.StartInfo.FileName = filePath;
pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/gameserver.php?port=" + textBox1.Text + "&rbxl=" + textBox2.Text + "\" -t \"1\"";
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
pProcess.StartInfo.CreateNoWindow = false;
pProcess.Start();
pProcess.EnableRaisingEvents = true;
pProcess.Exited += new EventHandler(ProcessExitHandler);
var random = new Random();
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Hosting",
State = textBox2.Text,
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "host",
SmallImageKey = "archblox",
}
});
MessageBox.Show("Starting game server on port " + textBox1.Text + " using " + textBox2.Text, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button2_Click(object sender, EventArgs e)
{
// joining
if (!System.IO.File.Exists(filePath))
{
DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes or select the Install button on the main menu.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (res == DialogResult.Yes)
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
form2.Show();
}
}
else if (serverip.Text == "" || serverport.Text == "")
{
MessageBox.Show("Please fill in all of the text boxes.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
void ProcessExitHandler(object sender, EventArgs args)
{
ingame = false;
if (hosting == true)
{
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Hosting",
State = textBox2.Text,
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "host",
SmallImageKey = "archblox",
}
});
}
else
{
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Launcher",
State = "Browsing through the menus...",
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "launcher",
SmallImageKey = "archblox",
}
});
}
}
var pProcess = new Process();
ingame = true;
pProcess.StartInfo.FileName = filePath;
pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/join.ashx?port=" + serverport.Text + "&ip=" + serverip.Text + "\" -t \"1\"";
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
pProcess.StartInfo.CreateNoWindow = false;
pProcess.Start();
pProcess.EnableRaisingEvents = true;
pProcess.Exited += new EventHandler(ProcessExitHandler);
// Check if RADMIN VPN ip address to protect port forwarders from exposing their ip address and potentionally causing the server hoster to be doxxed/ddossed
string phrase2 = serverip.Text;
string[] words2 = phrase2.Split('.');
string sWord2 = "";
bool radmin = false;
foreach (var word in words2)
{
sWord2 = word.ToLower();
if (sWord2 == "26" || sWord2 == "localhost" || sWord2 == "192" || sWord2 == "10" || sWord2 == "127")
{
radmin = true;
}
else
{
radmin = false;
}
break;
}
if (radmin == false)
{
phrase2 = "[IP HIDDEN]"; // HAHAHA DUDE THESE DOXXERS AND DDOSSERS ARE SO FUCKING FUNNY THEY MAKE ME WANT TO MERGE WITHOUT LOOKING!!!!
}
client.SetPresence(new DiscordRPC.RichPresence()
{
Details = "Playing a Game",
State = "on " + phrase2 + ":" + serverport.Text,
Timestamps = Timestamps.Now,
Assets = new Assets()
{
LargeImageKey = "ingame",
SmallImageKey = "archblox",
}
}); ;
MessageBox.Show("Joining " + serverip.Text + ":" + serverport.Text, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button3_Click(object sender, EventArgs e)
{
// ask user to open dialog
OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "Choose a RBXL...";
dialog.AddExtension = true;
dialog.Filter = "ROBLOX Place File (*.rbxl)| *.rbxl";
if (DialogResult.OK == dialog.ShowDialog())
{
// check if it is a rbxl
string word = Path.GetExtension(dialog.FileName);
word = word.ToLower();
if (word == ".rbxl")
{
// Thanks to ROBLOX LEGACY PLACE CONVERTER by BakonBot for the binary rbxl format detection.
string[] file = System.IO.File.ReadAllLines(dialog.FileName);
foreach (var line in file)
{
if (line.Contains("<roblox!"))
{
// is binary/unsupported format
MessageBox.Show("Binary ROBLOX Place files are not supported. Did you convert the place correctly, or use ARCHBLOX Studio to create the game?", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
// it's supported, yay!
string destFile = Path.Combine(clientPath, @"Content\", Path.GetFileName(dialog.FileName));
System.IO.File.Copy(dialog.FileName, destFile, true);
textBox2.Text = Path.GetFileName(dialog.FileName);
return;
}
}
}
else if (word == ".rbxlx")
{
// rbxlx, cringe!
MessageBox.Show(".RBXLX place files are not supported! Are you sure you converted the place correctly?", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
// wtf this isn't even a place
MessageBox.Show(word.ToUpper() + " is not a supported place file!", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void JoinBTN_Click(object sender, EventArgs e)
{
JoinBTN.Visible = false;
HostBTN.Visible = false;
UpdateBTN.Visible = false;
JoinBox.Visible = true;
HostBox.Visible = false;
BackBTN.Visible = true;
}
private void UpdateBTN_Click(object sender, EventArgs e)
{
ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2();
try
{
form2.Show();
}
catch
{
form2.Dispose();
}
}
private void BackBTN_Click(object sender, EventArgs e)
{
JoinBTN.Visible = true;
HostBTN.Visible = true;
UpdateBTN.Visible = true;
JoinBox.Visible = false;
HostBox.Visible = false;
BackBTN.Visible = false;
}
private void HostBTN_Click(object sender, EventArgs e)
{
JoinBTN.Visible = false;
HostBTN.Visible = false;
UpdateBTN.Visible = false;
JoinBox.Visible = false;
HostBox.Visible = true;
BackBTN.Visible = true;
}
}
}