diff options
Diffstat (limited to 'source/WindowsFormsApplication1/Online/Package_Grabber.cs')
| -rw-r--r-- | source/WindowsFormsApplication1/Online/Package_Grabber.cs | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/source/WindowsFormsApplication1/Online/Package_Grabber.cs b/source/WindowsFormsApplication1/Online/Package_Grabber.cs new file mode 100644 index 0000000..b6bbc61 --- /dev/null +++ b/source/WindowsFormsApplication1/Online/Package_Grabber.cs @@ -0,0 +1,402 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using System.IO.Compression; +using Newtonsoft.Json; +using System.Windows.Forms; +using System.Threading; +using System.Drawing; +using NetSockets; + +namespace ShiftOS +{ + [Serializable] + public class ObjectModel + { + public string SysId { get; set; } + public string Command { get; set; } + public object OptionalObject { get; set; } + } + + [Serializable] + public class ChatUser + { + public string Name { get; set; } + public event EventHandler OnJoin; + public event EventHandler OnLeave; + } + + [Serializable] + public class ChatMessage + { + public string Text { get; set; } + public ChatUser User { get; set; } + } + + class Package_Grabber + { + + + public static Dictionary<string, NetObjectClient> clients = null; + + /// <summary> + /// Connect to a ShiftOS server + /// </summary> + /// <param name="address">IP address</param> + /// <param name="port">Port (typically this is 4433.)</param> + public static void ConnectToServer(string address, int port) + { + if(clients == null) + { + clients = new Dictionary<string, NetObjectClient>(); + } + bool blacklisted = false; + string blacklist = new WebClient().DownloadString("http://playshiftos.ml/server/blacklist"); + string[] splitter = blacklist.Split(';'); + foreach (string addr in splitter) + { + try + { + string[] addSplitter = addr.Split(':'); + string host = addSplitter[0]; + int prt = Convert.ToInt32(addSplitter[1]); + if(address == host && port == prt) + { + blacklisted = true; + } + } + catch + { + + } + } + if (!blacklisted) + { + var client = new NetObjectClient(); + client.OnReceived += (object s, NetReceivedEventArgs<NetObject> a) => + { + try + { + var obj = (ObjectModel)a.Data.Object; + if (obj.Command == "set_ident") + { + this_id = obj.SysId; + } + } + catch + { + + } + }; + + try + { + client.Connect(address, port); + clients.Add(client.RemoteHost, client); + } + catch + { + } + } + else + { + API.CreateInfoboxSession("Server Connection Error", "The server you are trying to connect to has been blacklisted for breaking the rules of the Server Showcase, therefore you may not connect to it.", infobox.InfoboxMode.Info); + } + } + + private static string this_id = ""; + + /// <summary> + /// Send a message to a server. + /// </summary> + /// <param name="host">Server hostname/IP</param> + /// <param name="text">Messge contents.</param> + public static void SendMessage(string host, string text) + { + var obj = new ObjectModel(); + obj.SysId = this_id; + obj.Command = text; + try { + clients[host].Send(new NetObject("test", obj)); + } + catch + { + + } + } + + /// <summary> + /// Send a message to a server containing a .NET object. + /// </summary> + /// <param name="host">Server hostname/IP</param> + /// <param name="text">Message text.</param> + /// <param name="optional">The object to go with it.</param> + public static void SendMessage(string host, string text, object optional) + { + var obj = new ObjectModel(); + obj.SysId = this_id; + obj.Command = text; + obj.OptionalObject = optional; + try { + clients[host].Send(obj.SysId, obj); + } + catch + { + + } + } + + + + /// <summary> + /// Disconnect from a server. + /// </summary> + /// <param name="host">Server host.</param> + public static void Disconnect(string host) + { + if(clients.ContainsKey(host)) + { + if(clients[host].IsConnected == true) + { + clients[host].Disconnect(); + } + } + } + + + /// <summary> + /// Download a package through spkg. + /// </summary> + /// <param name="pkgname">Package name</param> + /// <returns>Could it download?</returns> + public static bool GetPackage(string pkgname) + { + bool result = true; + try + { + string downloadpath = Paths.Mod_Temp; + if (!Directory.Exists(downloadpath)) + { + Directory.CreateDirectory(downloadpath); + } else + { + Directory.Delete(downloadpath, true); + Directory.CreateDirectory(downloadpath); + } + WebClient wc = new WebClient(); + wc.DownloadFile("http://playshiftos.ml/shiftnet/packages/" + pkgname + ".pkg", downloadpath + pkgname + ".pkg"); + LastPackage_DownloadPath = downloadpath + pkgname + ".pkg"; + } + catch + { + result = false; + } + return result; + } + + public static string LastPackage_DownloadPath = null; + + /// <summary> + /// Extracts the last downloaded package. + /// </summary> + /// <returns>The temp path</returns> + public static string ExtractPackage() + { + if (LastPackage_DownloadPath != null) + { + string packagedir = null; + if (LastPackage_DownloadPath.EndsWith(".pkg")) + { + packagedir = LastPackage_DownloadPath.Replace(".pkg", ""); + } + else + { + packagedir = LastPackage_DownloadPath.Replace(".stp", ""); + } + if (Directory.Exists(packagedir)) + { + Directory.Delete(packagedir, true); + } + ZipFile.ExtractToDirectory(LastPackage_DownloadPath, packagedir); + return packagedir; + } + else + { + return "fail"; + } + } + + /// <summary> + /// Extract a specified .stp or .pkg file. + /// </summary> + /// <param name="localpath">File to extract</param> + /// <returns>The new temp path</returns> + public static string ExtractPackage(string localpath) + { + try { + + string packagedir = Paths.Mod_Temp + "pkg"; + if (Directory.Exists(packagedir)) + { + Directory.Delete(packagedir, true); + } + Directory.CreateDirectory(packagedir); + ZipFile.ExtractToDirectory(localpath, packagedir); + return packagedir; + } + catch + { + return "fail"; + } + } + + /// <summary> + /// Install a package from a directory + /// </summary> + /// <param name="dir">The package directory</param> + /// <returns>Could it install?</returns> + public static string InstallPackage(string dir) + { + try + { + string dirsepchar = "\\"; + switch (OSInfo.GetPlatformID()) + { + case "microsoft": + dirsepchar = "\\"; + break; + default: + dirsepchar = "/"; + break; + } + string alfile = null; + foreach (string file in Directory.GetFiles(dir)) + { + if (file.Contains("applauncher")) + { + alfile = file; + } + } + string json = File.ReadAllText(alfile); + if (!Directory.Exists(Paths.Mod_AppLauncherEntries)) + { + Directory.CreateDirectory(Paths.Mod_AppLauncherEntries); + } + ModApplauncherItem itm = JsonConvert.DeserializeObject<ModApplauncherItem>(json); + File.WriteAllText(Paths.Mod_AppLauncherEntries + itm.Name, json); + //Applauncher Entry installed! + if (!Directory.Exists(Paths.Applications + itm.AppDirectory)) + { + Directory.CreateDirectory(Paths.Applications + itm.AppDirectory); + } + + Thread.Sleep(200); + if (!File.Exists(Paths.Applications + itm.AppDirectory + dirsepchar + "Icon.bmp")) + { + File.Copy(dir + "Icon.bmp", Paths.Applications + itm.AppDirectory + dirsepchar + "Icon.bmp"); + } + if (File.Exists(Paths.Applications + itm.AppDirectory + dirsepchar + "app.saa")) + { + File.Delete(Paths.Applications + itm.AppDirectory + dirsepchar + "app.saa"); + } + File.Move(dir + "app.saa", Paths.Applications + itm.AppDirectory + dirsepchar + "app.saa"); + //App installed. + foreach (string file in Directory.GetFiles(dir)) + { + if (file.EndsWith(".dll")) + { + if (!File.Exists(Paths.Applications + itm.AppDirectory + dirsepchar + new FileInfo(file).Name)) + { + //Dependencies are fucking bitches. + File.Copy(file, Paths.Applications + itm.AppDirectory + dirsepchar + new FileInfo(file).Name); + } + } + } + //Dependencies installed. + API.CurrentSession.SetupAppLauncher(); + return "success"; + } + catch (Exception ex) + { + return ex.Message; + } + } + } + + class FTP_API + { + /// <summary> + /// Gets a package image from the ShiftOS website + /// </summary> + /// <param name="ftpFilePath">Image path relative to the packages directory</param> + /// <returns>The image</returns> + [Obsolete] + public static Image GetImage(string ftpFilePath) + { + var request = WebRequest.Create("http://playshiftos.ml/appscape/packages/" + ftpFilePath); + + using (var response = request.GetResponse()) + { + using (var str = response.GetResponseStream()) + { + return Image.FromStream(str); + } + } + } + + [Obsolete] + public static Image GetSkinImage(string ftpFilePath) + { + var request = WebRequest.Create("http://playshiftos.ml/appscape/skins/" + ftpFilePath); + + using (var response = request.GetResponse()) + { + using (var str = response.GetResponseStream()) + { + return Image.FromStream(str); + } + } + } + } + + + [Serializable] + public class AppscapeModder + { + public string DevKey { get; set; } + public string Name { get; set; } + public string Bio { get; set; } + public string BitnoteAddress { get; set; } + } + + [Serializable] + public class AppscapePackage + { + public string Name { get; set; } + public string Address { get; set; } + public string DevKey { get; set; } + public string Description { get; set; } + public string SetupFile { get; set; } + public string PkgIconPath { get; set; } + public string ScreenshotPath { get; set; } + public decimal Cost { get; set; } + public string Server { get; set; } + } + + [Serializable] + public class SkinData + { + public string Name { get; set; } + public string Author { get; set; } + public string Description { get; set; } + public string Download { get; set; } + public string Icon { get; set; } + public string Screenshot { get; set; } + public decimal Cost { get; set; } + public string Server { get; set; } + } +} |
