mirror of
https://github.com/seriocomedy/ShiftOS-C-.git
synced 2025-01-22 10:50:27 -05:00
84f689b91a
It feels better to know what's responsible for what... Plus I removed some un-needed C# stuff.
402 lines
13 KiB
C#
402 lines
13 KiB
C#
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; }
|
|
}
|
|
}
|