aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/Scripting.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS_TheReturn/Scripting.cs')
-rw-r--r--ShiftOS_TheReturn/Scripting.cs426
1 files changed, 41 insertions, 385 deletions
diff --git a/ShiftOS_TheReturn/Scripting.cs b/ShiftOS_TheReturn/Scripting.cs
index 72ab5ec..bea2568 100644
--- a/ShiftOS_TheReturn/Scripting.cs
+++ b/ShiftOS_TheReturn/Scripting.cs
@@ -27,9 +27,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using IronPython;
-using IronPython.Hosting;
-using Microsoft.Scripting.Hosting;
using System.Reflection;
using ShiftOS.Objects.ShiftFS;
using DynamicLua;
@@ -60,28 +57,52 @@ namespace ShiftOS.Engine.Scripting
//This temporary proxy() method will be used by the API prober.
Lua.proxy = new Func<string, dynamic>((objName) =>
{
- var asm = Assembly.GetExecutingAssembly();
- foreach (var type in asm.GetTypes())
+ foreach (var f in System.IO.Directory.GetFiles(Environment.CurrentDirectory))
{
- if (type.Name == objName)
+ if (f.EndsWith(".exe") || f.EndsWith(".dll"))
{
- dynamic dynObj = Activator.CreateInstance(type);
- return dynObj;
+ try
+ {
+
+ var asm = Assembly.LoadFile(f);
+ foreach (var type in asm.GetTypes())
+ {
+ if (type.Name == objName)
+ {
+ dynamic dynObj = Activator.CreateInstance(type);
+ return dynObj;
+ }
+
+ }
+ }
+ catch { }
}
-
}
throw new Exception("{CLASS_NOT_FOUND}");
});
- var thisasm = Assembly.GetExecutingAssembly();
- foreach (var type in thisasm.GetTypes())
+ foreach (var f in System.IO.Directory.GetFiles(Environment.CurrentDirectory))
{
- foreach (var attr in type.GetCustomAttributes(false))
+ if (f.EndsWith(".exe") || f.EndsWith(".dll"))
{
- if (attr is ExposedAttribute)
+ try
+ {
+ var thisasm = Assembly.LoadFile(f);
+ foreach (var type in thisasm.GetTypes())
+ {
+ foreach (var attr in type.GetCustomAttributes(false))
+ {
+ if (attr is ExposedAttribute)
+ {
+ var eattr = attr as ExposedAttribute;
+ Lua($"{eattr.Name} = proxy(\"{type.Name}\")");
+ }
+ }
+ }
+ }
+ catch
{
- var eattr = attr as ExposedAttribute;
- Lua($"{eattr.Name} = proxy(\"{type.Name}\")");
+
}
}
}
@@ -127,382 +148,17 @@ namespace ShiftOS.Engine.Scripting
}
}
- public class LuaVirus : Virus
- {
- public override string Signature
- {
- get
- {
- return signature;
- }
- }
-
- public override int ThreatLevel
- {
- get
- {
- return _threatlevel;
- }
- }
-
- public override string Type
- {
- get
- {
- return "lua";
- }
- }
-
- private LuaInterpreter interpreter = null;
- private string signature = "unknown";
-
- private int _threatlevel = 0;
-
- public LuaVirus(string script, int threatLevel) : base()
- {
- _threatlevel = threatLevel;
-
- interpreter = new LuaInterpreter();
-
- Action<string> mud_message = new Action<string>((sig) =>
- {
- signature = sig;
- });
-
- ServerManager.MessageReceived += (msg) =>
- {
- if(msg.Name == "mud_virus_signature")
- {
- mud_message?.Invoke(msg.Contents);
- mud_message = null;
- }
- };
-
- ServerManager.SendMessage("mud_scanvirus", script);
-
- _script = script;
- }
-
-
- private string _script = "";
-
- public override void Activate()
- {
- interpreter.Execute(_script);
- }
-
- public override void Deactivate()
- {
- interpreter.Running = false;
- interpreter = null;
- }
- }
-
- [Exposed("consts")]
- public class Constants
- {
- public readonly DockStyle dock_none = DockStyle.None;
- public readonly DockStyle dock_top = DockStyle.Top;
- public readonly DockStyle dock_bottom = DockStyle.Bottom;
- public readonly DockStyle dock_left = DockStyle.Left;
- public readonly DockStyle dock_right = DockStyle.Right;
- public readonly DockStyle dock_fill = DockStyle.Fill;
-
- public readonly AnchorStyles anchor_none = 0x00;
- public readonly AnchorStyles anchor_top = AnchorStyles.Top;
- public readonly AnchorStyles anchor_bottom = AnchorStyles.Bottom;
- public readonly AnchorStyles anchor_left = AnchorStyles.Left;
- public readonly AnchorStyles anchor_right = AnchorStyles.Right;
-
- }
-
- [Exposed("shiftos")]
- public class CoreAPI
- {
- public void sleep(int ms) { Thread.Sleep(ms); }
-
- public bool isRunning() { return !SaveSystem.ShuttingDown; }
-
- public int random(int min, int max)
- {
- return new Random().Next(min, max);
- }
-
- public void info(string title, string message)
- {
- Infobox.Show(title, message);
- }
-
- public void executeCommand(string cmd)
- {
- TerminalBackend.InvokeCommand(cmd);
- }
-
- public void shutdown()
- {
- TerminalBackend.InvokeCommand("sys.shutdown");
- }
- }
- [Exposed("shiftorium")]
- public class ShiftoriumAPI
- {
- public dynamic[] getAvailable()
- {
- return Shiftorium.GetAvailable();
- }
-
- public dynamic[] getAll()
- {
- return Shiftorium.GetDefaults().ToArray();
- }
-
- public bool upgradeInstalled(string id)
- {
- return Shiftorium.UpgradeInstalled(id);
- }
-
- public bool buy(ShiftoriumUpgrade upgrade)
- {
- foreach (var upg in getAvailable())
- {
- if (upg.ID == upgrade && SaveSystem.CurrentSave.Codepoints >= upg.Cost)
- {
- return true;
- }
- }
- return false;
- }
- }
-
- [Exposed("gui")]
- public class GuiAPI
- {
- public void addControl(dynamic parent, dynamic child)
- {
- parent.Controls.Add(child);
- }
-
- public dynamic size(int width, int height)
- {
- return new System.Drawing.Size(width, height);
- }
-
- public dynamic point(int x, int y)
- {
- return new System.Drawing.Point(x, y);
- }
-
- public dynamic rect(dynamic p, dynamic s)
- {
- return new System.Drawing.Rectangle(p, s);
- }
-
- public dynamic rect(int x, int y, int w, int h)
- {
- return new System.Drawing.Rectangle(x, y, w, h);
- }
-
- public dynamic panel()
- {
- return new Panel();
- }
-
- public dynamic label()
- {
- return new Label();
- }
-
- public dynamic button()
- {
- return new Button();
- }
-
- public dynamic listbox()
- {
- return new ListBox();
- }
-
- public dynamic combobox()
- {
- return new ComboBox();
- }
-
- public dynamic textbox()
- {
- return new TextBox();
- }
-
- public dynamic window()
- {
- return new Form();
- }
-
- }
-
- [Exposed("color")]
- public class ColorAPI
- {
- public dynamic fromRgb(int r, int g, int b)
- {
- return System.Drawing.Color.FromArgb(r, g, b);
- }
-
- public dynamic fromArgb(int a, int r, int g, int b)
- {
- return System.Drawing.Color.FromArgb(a, r, g, b);
- }
-
- public dynamic fromName(string name)
- {
- return System.Drawing.Color.FromName(name);
- }
- }
-
- [Exposed("fonts")]
- public class FontsAPI
- {
- public readonly int style_regular = 0x00;
- public readonly int style_bold = 0x01;
- public readonly int style_italic = 0x02;
- public readonly int style_underline = 0x04;
- public readonly int style_strike = 0x08;
-
- public dynamic create(string name, float size, int style)
- {
- return new System.Drawing.Font(name, size, (System.Drawing.FontStyle)style);
- }
-
- }
-
- [Exposed("json")]
- public class JsonAPI
- {
- public string serialize(dynamic dynObj)
- {
- return JsonConvert.SerializeObject(dynObj);
- }
-
- public dynamic deserialize(string json)
- {
- return JsonConvert.DeserializeObject<dynamic>(json);
- }
- }
-
- [Exposed("fs")]
- public class FilesystemAPI
- {
- public void writeAllText(string target, string contents)
- {
- Utils.WriteAllText(target, contents);
- }
-
- public string readAllText(string file)
- {
- return Utils.ReadAllText(file);
- }
-
- public bool fileExists(string file)
- {
- return Utils.FileExists(file);
- }
-
- public bool directoryExists(string dir)
- {
- return Utils.DirectoryExists(dir);
- }
-
- public void createDirectory(string dir)
- {
- Utils.CreateDirectory(dir);
- }
-
- //experimental - no idea how arrays will be handled in Lua...
- public string[] getFiles(string dir)
- {
- return Utils.GetFiles(dir);
- }
-
- public string[] getDirectories(string dir)
- {
- return Utils.GetDirectories(dir);
- }
-
- public string mount(string mfsFile)
- {
- Utils.MountPersistent(mfsFile);
- return $"{Utils.Mounts.Count - 1}:";
- }
-
- public void unmount(int driveNum)
- {
- Utils.Mounts.RemoveAt(driveNum);
- }
-
- }
-
-
- public class PythonInterpreter
- {
- ScriptEngine python;
- ScriptScope pyScope;
- ScriptSource pySource;
-
- public PythonInterpreter()
- {
- python = Python.CreateEngine();
- pyScope = python.CreateScope();
- AddExposedObjects();
- }
-
- private void AddExposedObjects()
- {
- var asm = Assembly.GetExecutingAssembly();
- foreach(var type in asm.GetTypes())
- {
- foreach(var attr in type.GetCustomAttributes(false))
- {
- if(attr is ExposedAttribute)
- {
- var eattr = attr as ExposedAttribute;
- dynamic dynObj = Activator.CreateInstance(type);
- pyScope.SetVariable(eattr.Name, dynObj);
- }
- }
- }
- }
-
- public void ExecuteFile(string file)
- {
- if(Utils.FileExists(file))
- {
- Execute(Utils.ReadAllText(file));
- }
- else
- {
- throw new Exception("The file \"" + file + "\" was not found on the system.");
- }
- }
-
- public void Execute(string py)
- {
- Console.WriteLine("");
- pySource = python.CreateScriptSourceFromString(py, Microsoft.Scripting.SourceCodeKind.AutoDetect);
- pySource.Execute(pyScope);
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
- }
- }
-
public class ExposedAttribute : Attribute
{
/// <summary>
- /// Marks the following class as exposed to the ShiftOS Scripting System.
+ /// If applied to a non-static class, the ShiftOS engine will see this class as a Lua object of the specified name.
/// </summary>
- /// <param name="objName">The object name that the Scripting System should use as the variable name for scripts.</param>
- public ExposedAttribute(string objName)
+ /// <param name="name">The name of the Lua object</param>
+ public ExposedAttribute(string name)
{
- Name = objName;
+ Name = name;
}
- public string Name { get; set; }
+ public string Name { get; private set; }
}
}