Launcher/ItteBloxLauncher/LauncherWindow.cs

221 lines
8.8 KiB
C#

using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ItteBloxLauncher
{
public partial class LauncherWindow : Form
{
string[] args = Program.args;
BackgroundWorker bg;
public LauncherWindow()
{
InitializeComponent();
bg = new BackgroundWorker();
bg.DoWork += ExtractTask;
bg.ProgressChanged += UpdateProgress;
bg.WorkerReportsProgress = true;
}
public string Get(string uri)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
private void UpdateProgress(object sender, ProgressChangedEventArgs e)
{
Progress.Value = e.ProgressPercentage;
}
private void ExtractTask(object sender, DoWorkEventArgs e)
{
string downloadserver = Get("http://ittblox.gay/api/launcher/setupsite.php");
string year = args[0].Substring(6, 7).Replace("/", string.Empty).Replace(":", string.Empty);
string vrsn = Get("http://ittblox.gay/api/launcher/version" + year);
string dir = Application.StartupPath + "\\" + year;
if (Directory.Exists(dir))
Directory.Delete(dir, true);
using (var client = new System.Net.Http.HttpClient())
using (var stream = client.GetStreamAsync(downloadserver + "/" + year + ".zip").Result)
{
var basepath = Path.Combine(dir);
System.IO.Directory.CreateDirectory(basepath);
var ar = new System.IO.Compression.ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Read);
var i = 0.0;
foreach (var entry in ar.Entries)
{
i += 1.0;
int percentage = Convert.ToInt32(i / (double)ar.Entries.Count * 100);
bg.ReportProgress(percentage);
//MessageBox.Show(percentage.ToString());
var path = Path.Combine(basepath, entry.FullName);
if (string.IsNullOrEmpty(entry.Name))
{
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(path));
continue;
}
using (var entryStream = entry.Open())
{
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(path));
using (var file = File.Create(path))
{
entryStream.CopyTo(file);
}
}
}
}
File.WriteAllText(Application.StartupPath + "\\version" + year + ".txt", vrsn);
LaunchClient(year);
return;
}
void UpgradeAndLaunch(string year, string vrsn)
{
string downloadserver = Get("http://ittblox.gay/api/launcher/setupsite.php");
if (downloadserver == "")
{
MessageBox.Show("Download server is not available");
Application.Exit();
}
else
{
///Status.Text = "Downloading...";
bg.RunWorkerAsync();
}
return;
}
public async Task LaunchClient(string year)
{
Status.Text = "Launching";
string port = args[0].Substring(13, 5);
string token = args[0].Substring(18, 50);
string placeid = args[0].Substring(68).Replace("/", string.Empty);
string path = (string)Registry.CurrentUser.OpenSubKey("SOFTWARE\\Classes\\itblox").GetValue(year);
try
{
switch (year)
{
case "2013":
var proc13 = Process.Start(path, "-a \"http://ittblox.gay/\" -t 1 -j \"http://ittblox.gay/game/join.php?port=" + port + "&token=" + token + "\"");
while (string.IsNullOrEmpty(proc13.MainWindowTitle) && !proc13.HasExited)
{
await Task.Delay(500);
proc13.Refresh();
}
break;
case "216c":
var proc16c = Process.Start(path, "-a \"http://ittblox.gay/\" -t 1 -j \"http://ittblox.gay/game/2016/join.php?placeId=" + placeid + "&port=" + port + "&token=" + token + "\"");
while (string.IsNullOrEmpty(proc16c.MainWindowTitle) && !proc16c.HasExited)
{
await Task.Delay(500);
proc16c.Refresh();
}
break;
case "2016":
var proc16 = Process.Start(path, "-a \"http://ittblox.gay/\" -t 1 -j \"http://ittblox.gay/game/2016/join.php?placeId=" + placeid + "&port=" + port + "&token=" + token + "\"");
while (string.IsNullOrEmpty(proc16.MainWindowTitle) && !proc16.HasExited)
{
await Task.Delay(500);
proc16.Refresh();
}
break;
case "s16c":
var procst16c = Process.Start(path);
while (string.IsNullOrEmpty(procst16c.MainWindowTitle) && !procst16c.HasExited)
{
await Task.Delay(500);
procst16c.Refresh();
}
break;
case "ibox":
var procbox = Process.Start(path, args[0]);
while (string.IsNullOrEmpty(procbox.MainWindowTitle) && !procbox.HasExited)
{
await Task.Delay(500);
procbox.Refresh();
}
break;
case "st16":
var procst16 = Process.Start(path);
while (string.IsNullOrEmpty(procst16.MainWindowTitle) && !procst16.HasExited)
{
await Task.Delay(500);
procst16.Refresh();
}
break;
default:
MessageBox.Show("Invalid year!");
Application.Exit();
break;
}
}
catch (Exception a)
{
MessageBox.Show(a.ToString());
}
Application.Exit();
return;
}
private void LauncherWindow_Load(object sender, EventArgs e)
{
if (args.Length > 0)
{
if (Uri.TryCreate(args[0], UriKind.Absolute, out var uri) && string.Equals(uri.Scheme, "itblox", StringComparison.OrdinalIgnoreCase))
{
Status.Text = "Checking for updates";
string year = args[0].Substring(6, 7).Replace("/", string.Empty).Replace(":", string.Empty);
string vrsnpath = Application.StartupPath + "\\version" + year + ".txt";
string vrsn = Get("http://ittblox.gay/api/launcher/version" + year);
if (File.Exists(vrsnpath))
{
if (vrsn == File.ReadAllText(vrsnpath))
{
Progress.Value = 100;
LaunchClient(year);
} else {
Status.Text = "Upgrading ItteBlox";
UpgradeAndLaunch(year, vrsn);
return;
}
} else {
Status.Text = "Upgrading ItteBlox";
UpgradeAndLaunch(year, vrsn);
return;
}
}
}
else
{
Status.Text = "Join from the website to play!";
Progress.Value = 100;
}
}
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}