From 2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Tue, 13 Jun 2017 20:06:38 +1000 Subject: Python API It uses a meta-language and a CSharpCodeProvider on startup. I will release a tutorial on the forums soon showing how to use it. This commit also adds an extremely basic loading screen which shows while Desktop is getting everything ready. Which can take a while if you have any Python mods. Thanks, IronPython. --- ShiftOS_TheReturn/PythonAPI.cs | 309 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 ShiftOS_TheReturn/PythonAPI.cs (limited to 'ShiftOS_TheReturn/PythonAPI.cs') diff --git a/ShiftOS_TheReturn/PythonAPI.cs b/ShiftOS_TheReturn/PythonAPI.cs new file mode 100644 index 0000000..f3dbe29 --- /dev/null +++ b/ShiftOS_TheReturn/PythonAPI.cs @@ -0,0 +1,309 @@ +/* + * MIT License + * + * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using System.Reflection; +using IronPython.Hosting; +using Microsoft.Scripting.Hosting; +using IronPython.Runtime; +using Microsoft.Scripting.Runtime; +using Microsoft.CSharp; +using System.CodeDom.Compiler; +using System.Security.Cryptography; + +namespace ShiftOS.Engine +{ + /// + /// The C# side of the ShiftOS Python API. + /// + public static class PythonHelper + { + /// + /// Creates and sets up a new Python engine. + /// + /// The Python engine. + private static ScriptEngine NewEngine() + { + var pyengine = Python.CreateEngine(); + var search = pyengine.GetSearchPaths(); + search.Add("Lib"); + pyengine.SetSearchPaths(search); + pyengine.Runtime.LoadAssembly(typeof(IronPython.Modules.PythonErrorNumber).Assembly); + return pyengine; + } + + /// + /// Runs Python code passed as a string. + /// + /// The code you want to run. + /// The code's scope. + public static ScriptScope RunCode(string code) + { + var pyengine = NewEngine(); + var source = pyengine.CreateScriptSourceFromString(code); + var scope = pyengine.CreateScope(); + source.Execute(scope); + return scope; + } + } + + /// + /// The interpreter for the meta-language in Python ShiftOS mods. + /// + public static class PythonAPI + { + private static class AsmCache + { + private static byte[] magic = Encoding.UTF8.GetBytes("AsmC"); + public static Dictionary Load(Stream fobj) + { + var ret = new Dictionary(); + var header = new byte[4]; + fobj.Read(header, 0, 4); + if (!header.SequenceEqual(magic)) + throw new Exception("This is not an assembly cache."); + var read = new BinaryReader(fobj); + var num = read.ReadInt32(); + for (int i = 0; i < num; i++) + { + var entry = new AsmCacheEntry(); + + // read filename (stored as Pascal string) + var flen = fobj.ReadByte(); + var fbytes = new byte[flen]; + fobj.Read(fbytes, 0, flen); + string fname = Encoding.UTF8.GetString(fbytes); + + // read SHA-512 checksum + fobj.Read(entry.checksum, 0, 64); + + // read assembly + var asmlen = read.ReadInt32(); + entry.asm = new byte[asmlen]; + fobj.Read(entry.asm, 0, asmlen); + + ret.Add(fname, entry); + } + return ret; + } + + public static void Save(Stream fobj, Dictionary data) + { + fobj.Write(magic, 0, 4); + var write = new BinaryWriter(fobj); + write.Write(data.Count); + foreach (var entry in data) + { + // write filename + var fbytes = Encoding.UTF8.GetBytes(entry.Key); + fobj.WriteByte((byte) fbytes.Length); + fobj.Write(fbytes, 0, fbytes.Length); + + // write SHA-512 checksum + fobj.Write(entry.Value.checksum, 0, 64); + + // write assembly + var asmlen = entry.Value.asm.Length; + write.Write(asmlen); + fobj.Write(entry.Value.asm, 0, asmlen); + } + } + } + private class AsmCacheEntry + { + public byte[] checksum, asm; + public AsmCacheEntry() + { + checksum = new byte[64]; + } + } + private static bool scanned = false; + public static Dictionary scopes; + /// + /// Finds Python mods and adds them to ReflectMan's Types list. + /// + public static void Scan() + { + if (scanned) + throw new Exception("PythonAPI.Scan() called multiple times"); + scopes = new Dictionary(); + var resman = new System.Resources.ResourceManager("ShiftOS.Engine.Properties.Resources", typeof(Properties.Resources).Assembly); + var provider = new CSharpCodeProvider(); + var parameters = new CompilerParameters(); + parameters.ReferencedAssemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().Select(f => f.Location).ToArray()); + parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll"); + parameters.GenerateInMemory = false; // We need to keep the temporary file around long enough to copy it to the cache. + parameters.GenerateExecutable = false; + var types = new List(); + var sha = new SHA512Managed(); + var oldcache = new Dictionary(); + var newcache = new Dictionary(); + if (File.Exists("pyasmcache.dat")) + using (var stream = File.OpenRead("pyasmcache.dat")) + try + { + oldcache = AsmCache.Load(stream); + } + catch (Exception ex) + { +#if DEBUG + Console.WriteLine("[dev] Failed to read the assembly cache."); + Console.WriteLine(ex.ToString()); +#endif + } + foreach (var fname in Directory.GetFiles(Environment.CurrentDirectory, "*.py").Select(Path.GetFileName)) + { + byte[] checksum; + using (FileStream stream = File.OpenRead(fname)) + checksum = sha.ComputeHash(stream); + var script = File.ReadAllText(fname); + try + { + scopes[fname] = PythonHelper.RunCode(script); + } + catch (Exception ex) + { + Console.WriteLine("[dev] Failed to execute Python script " + fname); + Console.WriteLine(ex.ToString()); + } + if (oldcache.ContainsKey(fname)) + { + var oldentry = oldcache[fname]; + if (checksum.SequenceEqual(oldentry.checksum)) + { + try + { + types.AddRange(Assembly.Load(oldentry.asm).GetTypes()); + newcache.Add(fname, oldentry); + continue; + } + catch (Exception ex) + { +#if DEBUG + Console.WriteLine("[dev] Failed to load cached assembly for " + fname); + Console.WriteLine(ex.ToString()); +#endif + } + } + } + var scriptlines = script.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n'); // line-ending independent... + int pos = 0; + try + { + while (pos < scriptlines.Length) + { + while (!scriptlines[pos].StartsWith("#ShiftOS")) + pos++; + var templatename = scriptlines[pos].Split(':')[1]; + pos++; + string decorators = ""; + while (scriptlines[pos].StartsWith("#")) + { + decorators += scriptlines[pos].Substring(1) + Environment.NewLine; // remove # and add to string + pos++; + } + if (!scriptlines[pos].StartsWith("class ")) + throw new Exception("ShiftOS decorators without matching global class"); + var classname = scriptlines[pos].Split(' ')[1]; + if (classname.Contains("(")) // derived class + classname = classname.Split('(')[0]; + else + classname = classname.Remove(classname.Length - 1); // remove : + var code = String.Format(resman.GetString(templatename), decorators, classname, fname.Replace("\\", "\\\\")); // generate the C# wrapper class from template +#if DEBUG + Console.WriteLine(code); +#endif + var results = provider.CompileAssemblyFromSource(parameters, code); + if (results.Errors.HasErrors) + { + string except = "The wrapper class failed to compile."; + foreach (CompilerError error in results.Errors) + except += Environment.NewLine + error.ErrorText; + throw new Exception(except); + } + types.AddRange(results.CompiledAssembly.GetTypes()); // We did it! + var entry = new AsmCacheEntry(); + entry.asm = File.ReadAllBytes(results.PathToAssembly); + entry.checksum = checksum; + newcache.Add(fname, entry); + File.Delete(results.PathToAssembly); + pos++; // keep scanning the file for more classes + } + } + catch (Exception ex) // Skip any file that has issues + { +#if DEBUG + Console.WriteLine("[dev] Exception in the Python API: file " + fname + ", line " + pos.ToString() + "."); + Console.WriteLine(ex.ToString()); +#endif + } + } +#if DEBUG + Console.WriteLine("[dev] " + types.Count.ToString() + " Python mods loaded successfully."); +#endif + if (types.Count > 0) + { + ReflectMan.AddTypes(types.ToArray()); + using (var stream = File.OpenWrite("pyasmcache.dat")) + AsmCache.Save(stream, newcache); + } + scanned = true; + } + } + +#if DEBUG + [Namespace("dev")] + public static class PythonCmds + { + [Command("runpystring", description = "Run some Python code. (Only present in DEBUG builds of ShiftOS)")] + [RequiresArgument("script")] + public static bool RunPyString(Dictionary args) + { + try + { + PythonHelper.RunCode(args["script"].ToString()); + } + catch (Exception ex) { Console.WriteLine(ex.ToString()); } + return true; + } + + [Command("runpyfile", description = "Run some Python code from a file. (Only present in DEBUG builds of ShiftOS)")] + [RequiresArgument("script")] + public static bool RunPyFile(Dictionary args) + { + try + { + PythonHelper.RunCode(Objects.ShiftFS.Utils.ReadAllText(args["script"].ToString())); + } + catch (Exception ex) { Console.WriteLine(ex.ToString()); } + return true; + } + } +#endif +} -- cgit v1.2.3 From adf218ac25163d883e472dd68321f321c93c6f24 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Tue, 13 Jun 2017 21:01:34 +1000 Subject: fixed assembly cache format My first attempt at an assembly cache was a dictionary from a Python filename to its associated assembly... except each templated class in the file gets its own assembly. This new format (which has different magic numbers) provides a dictionary from a Python filename to a *list* of its associated assemblies. This also means that the cache can remember Python files with no associated assemblies so that they don't get scanned again. --- ShiftOS_TheReturn/PythonAPI.cs | 43 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'ShiftOS_TheReturn/PythonAPI.cs') diff --git a/ShiftOS_TheReturn/PythonAPI.cs b/ShiftOS_TheReturn/PythonAPI.cs index f3dbe29..49baa04 100644 --- a/ShiftOS_TheReturn/PythonAPI.cs +++ b/ShiftOS_TheReturn/PythonAPI.cs @@ -80,7 +80,7 @@ namespace ShiftOS.Engine { private static class AsmCache { - private static byte[] magic = Encoding.UTF8.GetBytes("AsmC"); + private static byte[] magic = Encoding.UTF8.GetBytes("ASMC"); public static Dictionary Load(Stream fobj) { var ret = new Dictionary(); @@ -103,10 +103,16 @@ namespace ShiftOS.Engine // read SHA-512 checksum fobj.Read(entry.checksum, 0, 64); - // read assembly - var asmlen = read.ReadInt32(); - entry.asm = new byte[asmlen]; - fobj.Read(entry.asm, 0, asmlen); + // read assemblies + var numasm = read.ReadInt32(); + for (int j = 0; j < numasm; j++) + { + var asmlen = read.ReadInt32(); + var asmdata = new byte[asmlen]; + fobj.Read(asmdata, 0, asmlen); + entry.asms.Add(asmdata); + + } ret.Add(fname, entry); } @@ -128,19 +134,25 @@ namespace ShiftOS.Engine // write SHA-512 checksum fobj.Write(entry.Value.checksum, 0, 64); - // write assembly - var asmlen = entry.Value.asm.Length; - write.Write(asmlen); - fobj.Write(entry.Value.asm, 0, asmlen); + // write assemblies + write.Write(entry.Value.asms.Count); + foreach (var asm in entry.Value.asms) + { + var asmlen = asm.Length; + write.Write(asmlen); + fobj.Write(asm, 0, asmlen); + } } } } private class AsmCacheEntry { - public byte[] checksum, asm; + public byte[] checksum; + public List asms; public AsmCacheEntry() { checksum = new byte[64]; + asms = new List(); } } private static bool scanned = false; @@ -199,7 +211,8 @@ namespace ShiftOS.Engine { try { - types.AddRange(Assembly.Load(oldentry.asm).GetTypes()); + foreach (var asm in oldentry.asms) + types.AddRange(Assembly.Load(asm).GetTypes()); newcache.Add(fname, oldentry); continue; } @@ -214,6 +227,8 @@ namespace ShiftOS.Engine } var scriptlines = script.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n'); // line-ending independent... int pos = 0; + var entry = new AsmCacheEntry(); + entry.checksum = checksum; try { while (pos < scriptlines.Length) @@ -248,10 +263,7 @@ namespace ShiftOS.Engine throw new Exception(except); } types.AddRange(results.CompiledAssembly.GetTypes()); // We did it! - var entry = new AsmCacheEntry(); - entry.asm = File.ReadAllBytes(results.PathToAssembly); - entry.checksum = checksum; - newcache.Add(fname, entry); + entry.asms.Add(File.ReadAllBytes(results.PathToAssembly)); File.Delete(results.PathToAssembly); pos++; // keep scanning the file for more classes } @@ -263,6 +275,7 @@ namespace ShiftOS.Engine Console.WriteLine(ex.ToString()); #endif } + newcache.Add(fname, entry); } #if DEBUG Console.WriteLine("[dev] " + types.Count.ToString() + " Python mods loaded successfully."); -- cgit v1.2.3 From bbbc00f204f77ca547340b010ec21662a62e3203 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Sat, 17 Jun 2017 00:31:09 +1000 Subject: Fixed multiple compilations for the Python API Previously, only one assembly could be compiled per startup. You could compile all of your mods by restarting the game over and over, loading the previously compiled mods from the cache. Now, that's not necessary. Oh yeah, also, more bugs in the Linux "port". Yippee. Whoops. --- LinuxLauncher/README.md | 3 +++ ShiftOS_TheReturn/PythonAPI.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'ShiftOS_TheReturn/PythonAPI.cs') diff --git a/LinuxLauncher/README.md b/LinuxLauncher/README.md index 7ee2a74..6b24dce 100644 --- a/LinuxLauncher/README.md +++ b/LinuxLauncher/README.md @@ -13,6 +13,9 @@ make an AUR package of this script if all goes to plan. enable properly * text input boxes are white on white * the terminal puts an extra newline after displaying the prompt +* Aiden Nirh's cutscene has weird overlapping text +* ShiftLetters seems to have no available word lists. Clicking Play +crashes the game. * the ShiftOS desktop can go in front of applications * there is a blue border from the Wine desktop (I want to change that to black, but I also don't want it showing through while the game is diff --git a/ShiftOS_TheReturn/PythonAPI.cs b/ShiftOS_TheReturn/PythonAPI.cs index 49baa04..cc3798c 100644 --- a/ShiftOS_TheReturn/PythonAPI.cs +++ b/ShiftOS_TheReturn/PythonAPI.cs @@ -167,11 +167,7 @@ namespace ShiftOS.Engine scopes = new Dictionary(); var resman = new System.Resources.ResourceManager("ShiftOS.Engine.Properties.Resources", typeof(Properties.Resources).Assembly); var provider = new CSharpCodeProvider(); - var parameters = new CompilerParameters(); - parameters.ReferencedAssemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().Select(f => f.Location).ToArray()); - parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll"); - parameters.GenerateInMemory = false; // We need to keep the temporary file around long enough to copy it to the cache. - parameters.GenerateExecutable = false; + var refs = AppDomain.CurrentDomain.GetAssemblies().Select(f => f.Location).Concat(new string[] { "Microsoft.CSharp.dll" }).ToArray(); var types = new List(); var sha = new SHA512Managed(); var oldcache = new Dictionary(); @@ -203,6 +199,7 @@ namespace ShiftOS.Engine { Console.WriteLine("[dev] Failed to execute Python script " + fname); Console.WriteLine(ex.ToString()); + continue; } if (oldcache.ContainsKey(fname)) { @@ -229,6 +226,10 @@ namespace ShiftOS.Engine int pos = 0; var entry = new AsmCacheEntry(); entry.checksum = checksum; + var parameters = new CompilerParameters(); + parameters.ReferencedAssemblies.AddRange(refs); + parameters.GenerateInMemory = false; // We need to keep the temporary file around long enough to copy it to the cache. + parameters.GenerateExecutable = false; try { while (pos < scriptlines.Length) @@ -264,7 +265,6 @@ namespace ShiftOS.Engine } types.AddRange(results.CompiledAssembly.GetTypes()); // We did it! entry.asms.Add(File.ReadAllBytes(results.PathToAssembly)); - File.Delete(results.PathToAssembly); pos++; // keep scanning the file for more classes } } -- cgit v1.2.3 From 79fe2101aef62b744b150203dee6953b0d17f5aa Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 16 Jun 2017 20:36:43 -0400 Subject: Get rid of namespaces in commands. --- ModLauncher/Program.cs | 11 - ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb | 1 - ShiftOS.Modding.VirtualMachine/Form1.cs | 1 - .../Applications/CoherenceOverlay.Designer.cs | 61 -- ShiftOS.WinForms/Applications/CoherenceOverlay.cs | 123 ---- ShiftOS.WinForms/Applications/Downloader.cs | 1 - ShiftOS.WinForms/Applications/Pong.cs | 25 +- ShiftOS.WinForms/Commands.cs | 299 --------- ShiftOS.WinForms/HackerCommands.cs | 723 +-------------------- ShiftOS.WinForms/OobeStory.cs | 1 - ShiftOS.WinForms/Servers/RemoteTerminalServer.cs | 1 - ShiftOS.WinForms/ShiftOS.WinForms.csproj | 6 - ShiftOS.WinForms/SkinCommands.cs | 1 - ShiftOS.WinForms/TestCommandsForUpgrades.cs | 22 +- ShiftOS.WinForms/TrailerCommands.cs | 48 -- ShiftOS.WinForms/WinformsDesktop.cs | 1 - ShiftOS_TheReturn/Command.cs | 36 - ShiftOS_TheReturn/Commands.cs | 274 +------- ShiftOS_TheReturn/PythonAPI.cs | 1 - ShiftOS_TheReturn/ReflectMan.cs | 1 - ShiftOS_TheReturn/TerminalBackend.cs | 66 +- ShiftOS_TheReturn/UserManagementCommands.cs | 2 - 22 files changed, 66 insertions(+), 1639 deletions(-) delete mode 100644 ShiftOS.WinForms/Applications/CoherenceOverlay.Designer.cs delete mode 100644 ShiftOS.WinForms/Applications/CoherenceOverlay.cs (limited to 'ShiftOS_TheReturn/PythonAPI.cs') diff --git a/ModLauncher/Program.cs b/ModLauncher/Program.cs index 4b99cf5..4637b4e 100644 --- a/ModLauncher/Program.cs +++ b/ModLauncher/Program.cs @@ -32,7 +32,6 @@ using ShiftOS.Engine; namespace ModLauncher { - [Namespace("modlauncher")] public static class Program { /// @@ -43,15 +42,5 @@ namespace ModLauncher { ShiftOS.WinForms.Program.Main(); } - - [Command("throwcrash")] - public static bool ThrowCrash() - { - new Thread(() => - { - throw new Exception("User triggered crash using modlauncher.throwcrash command."); - }).Start(); - return true; - } } } diff --git a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb index 161012d..3a2e106 100644 --- a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb +++ b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb @@ -14,7 +14,6 @@ Module Module1 End Module - Public Class SkinConverterCommands diff --git a/ShiftOS.Modding.VirtualMachine/Form1.cs b/ShiftOS.Modding.VirtualMachine/Form1.cs index 5b6b047..1615091 100644 --- a/ShiftOS.Modding.VirtualMachine/Form1.cs +++ b/ShiftOS.Modding.VirtualMachine/Form1.cs @@ -154,7 +154,6 @@ namespace ShiftOS.Modding.VirtualMachine } } - [Namespace("svm")] public static class Compiler { public static byte[] Compile(string prg) diff --git a/ShiftOS.WinForms/Applications/CoherenceOverlay.Designer.cs b/ShiftOS.WinForms/Applications/CoherenceOverlay.Designer.cs deleted file mode 100644 index 0764059..0000000 --- a/ShiftOS.WinForms/Applications/CoherenceOverlay.Designer.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -namespace ShiftOS.WinForms.Applications -{ - partial class CoherenceOverlay - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - } - - #endregion - } -} diff --git a/ShiftOS.WinForms/Applications/CoherenceOverlay.cs b/ShiftOS.WinForms/Applications/CoherenceOverlay.cs deleted file mode 100644 index 1bfc8e8..0000000 --- a/ShiftOS.WinForms/Applications/CoherenceOverlay.cs +++ /dev/null @@ -1,123 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using ShiftOS.Engine; -using System.Threading; - -namespace ShiftOS.WinForms.Applications -{ - public partial class CoherenceOverlay : UserControl, IShiftOSWindow - { - public CoherenceOverlay(IntPtr handle, CoherenceCommands.RECT rect) - { - InitializeComponent(); - this.Load += (o, a) => - { - try - { - int left = this.ParentForm.Left; - int top = this.ParentForm.Top; - int oldwidth = this.ParentForm.Width; - int oldheight = this.ParentForm.Height; - - var t = new Thread(new ThreadStart(() => - { - while (CoherenceCommands.GetWindowRect(handle, ref rect)) - { - - if (left != rect.Left - SkinEngine.LoadedSkin.LeftBorderWidth) - { - this.Invoke(new Action(() => - { - this.ParentForm.Left = rect.Left - SkinEngine.LoadedSkin.LeftBorderWidth; - left = rect.Left - SkinEngine.LoadedSkin.LeftBorderWidth; - })); - } - if (top != rect.Top - SkinEngine.LoadedSkin.TitlebarHeight) - { - this.Invoke(new Action(() => - { - - this.ParentForm.Top = rect.Top - SkinEngine.LoadedSkin.TitlebarHeight; - top = rect.Top - SkinEngine.LoadedSkin.TitlebarHeight; - })); - } - int width = (rect.Right - rect.Left) + 1; - int height = (rect.Bottom - rect.Top) + 1; - - if (oldheight != SkinEngine.LoadedSkin.TitlebarHeight + height + SkinEngine.LoadedSkin.BottomBorderWidth) - { - this.Invoke(new Action(() => - { - this.ParentForm.Height = SkinEngine.LoadedSkin.TitlebarHeight + height + SkinEngine.LoadedSkin.BottomBorderWidth; - oldheight = SkinEngine.LoadedSkin.TitlebarHeight + height + SkinEngine.LoadedSkin.BottomBorderWidth; - })); - } - if (oldwidth != SkinEngine.LoadedSkin.LeftBorderWidth + width + SkinEngine.LoadedSkin.RightBorderWidth) - { - this.Invoke(new Action(() => - { - this.ParentForm.Width = SkinEngine.LoadedSkin.LeftBorderWidth + width + SkinEngine.LoadedSkin.RightBorderWidth; - oldwidth = SkinEngine.LoadedSkin.LeftBorderWidth + width + SkinEngine.LoadedSkin.RightBorderWidth; - })); - } - } - })); - t.IsBackground = true; - t.Start(); - } - catch - { - - } - }; - } - - public void OnLoad() - { - } - - public void OnSkinLoad() - { - } - - public bool OnUnload() - { - return true; - } - - public void OnUpgrade() - { - } - } -} diff --git a/ShiftOS.WinForms/Applications/Downloader.cs b/ShiftOS.WinForms/Applications/Downloader.cs index b3d2cea..bcad56a 100644 --- a/ShiftOS.WinForms/Applications/Downloader.cs +++ b/ShiftOS.WinForms/Applications/Downloader.cs @@ -216,7 +216,6 @@ namespace ShiftOS.WinForms.Applications public int Progress { get; set; } } - [Namespace("dev")] public static class DownloaderDebugCommands { [Command("setsubscription", description ="Use to set the current shiftnet subscription.", usage ="{value:int32}")] diff --git a/ShiftOS.WinForms/Applications/Pong.cs b/ShiftOS.WinForms/Applications/Pong.cs index 87b7a93..3f06676 100644 --- a/ShiftOS.WinForms/Applications/Pong.cs +++ b/ShiftOS.WinForms/Applications/Pong.cs @@ -42,6 +42,15 @@ namespace ShiftOS.WinForms.Applications LevelComplete(); } }; +#if DEBUG + this.KeyDown += (o, a) => + { + if(a.KeyCode == Keys.D) + { + drawAiBall = !drawAiBall; + } + }; +#endif } private double ballX = 0.0f; @@ -266,11 +275,14 @@ namespace ShiftOS.WinForms.Applications ballX = 0; ballY = 0; opponentY = 0; + xVel = 1; aiBallX = 0; aiBallY = 0; doAi = true; } + private bool drawAiBall = false; + private void pnlcanvas_Paint(object sender, PaintEventArgs e) { @@ -281,11 +293,22 @@ namespace ShiftOS.WinForms.Applications ballXLocal -= ((double)paddleWidth / 2); ballYLocal -= ((double)paddleWidth / 2); + double aiballXLocal = linear(aiBallX, -1.0, 1.0, 0, pnlcanvas.Width); + double aiballYLocal = linear(aiBallY, -1.0, 1.0, 0, pnlcanvas.Height); + + aiballXLocal -= ((double)paddleWidth / 2); + aiballYLocal -= ((double)paddleWidth / 2); + e.Graphics.Clear(pnlcanvas.BackColor); + //draw the ai ball + if (drawAiBall) + e.Graphics.FillEllipse(new SolidBrush(Color.Gray), new RectangleF((float)aiballXLocal, (float)aiballYLocal, (float)paddleWidth, (float)paddleWidth)); + + //draw the ball - if(doBallCalc) + if (doBallCalc) e.Graphics.FillEllipse(new SolidBrush(pnlcanvas.ForeColor), new RectangleF((float)ballXLocal, (float)ballYLocal, (float)paddleWidth, (float)paddleWidth)); double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height); diff --git a/ShiftOS.WinForms/Commands.cs b/ShiftOS.WinForms/Commands.cs index b04ffe7..e69de29 100644 --- a/ShiftOS.WinForms/Commands.cs +++ b/ShiftOS.WinForms/Commands.cs @@ -1,299 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ShiftOS.Engine; -using System.IO; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading; -using Newtonsoft.Json; - -/// -/// Coherence commands. -/// -namespace ShiftOS.WinForms -{ - [Namespace("trm")] - public static class TerminalExtensions - { - [Command("exit")] - public static bool StopRemoting() - { - if(TerminalBackend.IsForwardingConsoleWrites == true) - { - ServerManager.SendMessage("trm_handshake_stop", $@"{{ - guid: ""{TerminalBackend.ForwardGUID}"" -}}"); - Console.WriteLine("Goodbye!"); - } - else - { - return false; - } - - return true; - } - - - [Command("setpass", true)] - [RequiresArgument("pass")] - public static bool setPass(Dictionary args) - { - SaveSystem.CurrentSave.Password = args["pass"] as string; - return true; - } - - [Command("remote", "username:,sysname:,password:", "Allows you to control a remote system on the multi-user domain given a username, password and system name.")] - [RequiresArgument("username")] - [RequiresArgument("sysname")] - [RequiresArgument("password")] - public static bool RemoteControl(Dictionary args) - { - ServerManager.SendMessage("trm_handshake_request", JsonConvert.SerializeObject(args)); - return true; - } - } - - [Namespace("coherence")] - [RequiresUpgrade("kernel_coherence")] - public static class CoherenceCommands - { - /// - /// Sets the window position. - /// - /// The window position. - /// H window. - /// H window insert after. - /// X. - /// Y. - /// Cx. - /// Cy. - /// U flags. - [DllImport("user32.dll")] - static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); - - /// - /// The HWN d TOPMOS. - /// - static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); - - /// - /// The SW p SHOWWINDO. - /// - const UInt32 SWP_SHOWWINDOW = 0x0040; - - - [DllImport("user32.dll")] - /// - /// Gets the window rect. - /// - /// The window rect. - /// H window. - /// Lp rect. - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); - - /// - /// REC. - /// - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public int Left; // x position of upper-left corner - public int Top; // y position of upper-left corner - public int Right; // x position of lower-right corner - public int Bottom; // y position of lower-right corner - } - - [Command("launch", "process: \"C:\\path\\to\\process\" - The process path to launch.", "Launch a process inside kernel coherence.")] - [RequiresArgument("process")] - /// - /// Launchs the app. - /// - /// The app. - /// Arguments. - public static bool LaunchApp(Dictionary args) - { - string process = args["process"].ToString(); - var prc = Process.Start(process); - StartCoherence(prc); - return true; - } - - /// - /// Starts the coherence. - /// - /// The coherence. - /// Prc. - private static void StartCoherence(Process prc) - { - RECT rct = new RECT(); - - - while (!GetWindowRect(prc.MainWindowHandle, ref rct)) - { - } - - - - AppearanceManager.Invoke(new Action(() => - { - IShiftOSWindow coherenceWindow = new Applications.CoherenceOverlay(prc.MainWindowHandle, rct); - - AppearanceManager.SetupWindow(coherenceWindow); - SetWindowPos(prc.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); - - //MakeExternalWindowBorderless(prc.MainWindowHandle); - })); - - } - - /// - /// The W s BORDE. - /// - const int WS_BORDER = 8388608; - - /// - /// The W s DLGFRAM. - /// - const int WS_DLGFRAME = 4194304; - - /// - /// The W s CAPTIO. - /// - const int WS_CAPTION = WS_BORDER | WS_DLGFRAME; - - /// - /// The W s SYSMEN. - /// - const int WS_SYSMENU = 524288; - - /// - /// The W s THICKFRAM. - /// - const int WS_THICKFRAME = 262144; - - /// - /// The W s MINIMIZ. - /// - const int WS_MINIMIZE = 536870912; - - /// - /// The W s MAXIMIZEBO. - /// - const int WS_MAXIMIZEBOX = 65536; - - /// - /// The GW l STYL. - /// - const int GWL_STYLE = -16; - - /// - /// The GW l EXSTYL. - /// - const int GWL_EXSTYLE = -20; - - /// - /// The W s E x DLGMODALFRAM. - /// - const int WS_EX_DLGMODALFRAME = 0x1; - - /// - /// The SW p NOMOV. - /// - const int SWP_NOMOVE = 0x2; - - /// - /// The SW p NOSIZ. - /// - const int SWP_NOSIZE = 0x1; - - /// - /// The SW p FRAMECHANGE. - /// - const int SWP_FRAMECHANGED = 0x20; - - /// - /// The M f BYPOSITIO. - /// - const uint MF_BYPOSITION = 0x400; - - /// - /// The M f REMOV. - /// - const uint MF_REMOVE = 0x1000; - - /// - /// Gets the window long. - /// - /// The window long. - /// H window. - /// N index. - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] - public static extern int GetWindowLong(IntPtr hWnd, int nIndex); - - /// - /// Sets the window long. - /// - /// The window long. - /// H window. - /// N index. - /// Dw new long. - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] - public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); - - /// - /// Sets the window position. - /// - /// The window position. - /// H window. - /// H window insert after. - /// X. - /// Y. - /// Cx. - /// Cy. - /// U flags. - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] - public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags); - public static void MakeExternalWindowBorderless(IntPtr MainWindowHandle) - { - int Style = 0; - Style = GetWindowLong(MainWindowHandle, GWL_STYLE); - Style = Style & ~WS_CAPTION; - Style = Style & ~WS_SYSMENU; - Style = Style & ~WS_THICKFRAME; - Style = Style & ~WS_MINIMIZE; - Style = Style & ~WS_MAXIMIZEBOX; - SetWindowLong(MainWindowHandle, GWL_STYLE, Style); - Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE); - SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style | WS_EX_DLGMODALFRAME); - SetWindowPos(MainWindowHandle, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - } - } -} diff --git a/ShiftOS.WinForms/HackerCommands.cs b/ShiftOS.WinForms/HackerCommands.cs index dd8bde8..5f28270 100644 --- a/ShiftOS.WinForms/HackerCommands.cs +++ b/ShiftOS.WinForms/HackerCommands.cs @@ -1,722 +1 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Newtonsoft.Json; -using ShiftOS.Engine; -using ShiftOS.Objects; -using ShiftOS.Objects.ShiftFS; -using ShiftOS.WinForms.Applications; -using static ShiftOS.Objects.ShiftFS.Utils; - -namespace ShiftOS.WinForms -{ - [Namespace("puppy")] - [RequiresUpgrade("hacker101_deadaccts")] - [KernelMode] - public static class KernelPuppyCommands - { - [Command("clear", true)] - public static bool ClearLogs() - { - WriteAllText("0:/system/data/kernel.log", ""); - Console.WriteLine(" logs cleared successfully."); - return true; - } - } - - [Namespace("krnl")] - public static class KernelCommands - { - [Command("control", true)] - [RequiresArgument("pass")] - public static bool Control(Dictionary args) - { - if(args["pass"].ToString() == ServerManager.thisGuid.ToString()) - { - KernelWatchdog.Log("warn", "User has breached the kernel."); - KernelWatchdog.EnterKernelMode(); - TerminalBackend.PrintPrompt(); - } - return true; - } - - [Command("lock_session")] - [KernelMode] - public static bool LeaveControl() - { - KernelWatchdog.Log("inf", "User has left the kernel-mode session."); - KernelWatchdog.LeaveKernelMode(); - KernelWatchdog.MudConnected = true; - return true; - } - } - - [Namespace("hacker101")] - [RequiresUpgrade("hacker101_deadaccts")] - public static class HackerCommands - { - private static void writeSlow(string text) - { - ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow; - ConsoleEx.Bold = false; - ConsoleEx.Italic = false; - Console.Write("["); - ConsoleEx.ForegroundColor = ConsoleColor.Magenta; - ConsoleEx.Bold = true; - Console.Write("hacker101"); - ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow; - ConsoleEx.Italic = true; - Console.Write("@"); - ConsoleEx.ForegroundColor = ConsoleColor.White; - Console.Write("undisclosed"); - ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow; - ConsoleEx.Bold = false; - ConsoleEx.Italic = false; - Console.Write("]: "); - Thread.Sleep(850); - Console.WriteLine(text); - Thread.Sleep(4000); - } - - [Story("hacker101_deadaccts")] - public static void DeadAccountsStory() - { - if (!terminalIsOpen()) - { - AppearanceManager.SetupWindow(new Terminal()); - } - - var t = new Thread(() => - { - Console.WriteLine("[sys@mud]: Warning: User connecting to system..."); - Thread.Sleep(75); - Console.WriteLine("[sys@mud]: UBROADCAST: Username: hacker101 - Sysname: undisclosed"); - Thread.Sleep(50); - Console.Write("--locking mud connection resources..."); - Thread.Sleep(50); - Console.WriteLine("...done."); - Console.Write("--locking user input... "); - Thread.Sleep(75); - TerminalBackend.PrefixEnabled = false; - TerminalBackend.InStory = true; - Console.WriteLine("...done."); - - Thread.Sleep(2000); - writeSlow($"Hello there, fellow multi-user domain user."); - writeSlow("My name, as you can tell, is hacker101."); - writeSlow("And yours must be... don't say it... it's " + SaveSystem.CurrentUser.Username + "@" + SaveSystem.CurrentSave.SystemName + ", right?"); - writeSlow("Of course it is."); - writeSlow("And I bet you 10,000 Codepoints that you have... " + SaveSystem.CurrentSave.Codepoints.ToString() + " Codepoints."); - writeSlow("Oh, and how much upgrades have you installed since you first started using ShiftOS?"); - writeSlow("That would be... uhh... " + SaveSystem.CurrentSave.CountUpgrades().ToString() + "."); - writeSlow("I'm probably freaking you out right now. You are probably thinking that you're unsafe and need to lock yourself down."); - writeSlow("But, don't worry, I mean no harm."); - writeSlow("In fact, I am a multi-user domain safety activist and security professional."); - writeSlow("I need your help with something."); - writeSlow("Inside the multi-user domain, every now and then these 'dead' user accounts pop up."); - writeSlow("They're infesting everything. They're in every legion, they infest chatrooms, and they take up precious hard drive space."); - writeSlow("Eventually there's going to be tons of them just sitting there taking over the MUD. We can't have that."); - writeSlow("It sounds like a conspiracy theory indeed, but it's true, in fact, these dead accounts hold some valuable treasures."); - writeSlow("I'm talking Codepoints, skins, documents, the possibilities are endless."); - writeSlow("I'm going to execute a quick sys-script that will show you how you can help get rid of these accounts, and also gain some valuable resources to help you on your digital frontier."); - writeSlow("This script will also show you the fundamentals of security exploitation and theft of resources - which if you want to survive in the multi-user domain is paramount."); - writeSlow("Good luck."); - Thread.Sleep(1000); - Console.WriteLine("--user disconnected"); - Thread.Sleep(75); - Console.WriteLine("--commands unlocked - check sos.help."); - Thread.Sleep(45); - SaveSystem.SaveGame(); - Console.Write("--unlocking user input..."); - Thread.Sleep(75); - Console.Write(" ..done"); - TerminalBackend.InStory = false; - TerminalBackend.PrefixEnabled = true; - Console.Write($"{SaveSystem.CurrentUser.Username}@{SaveSystem.CurrentSave.SystemName}:~$ "); - StartHackerTutorial(); - TerminalBackend.PrefixEnabled = true; - TerminalBackend.PrintPrompt(); - }); - t.IsBackground = true; - t.Start(); - TerminalBackend.PrefixEnabled = false; - } - - internal static void StartHackerTutorial() - { - Desktop.InvokeOnWorkerThread(() => - { - var tut = new TutorialBox(); - AppearanceManager.SetupWindow(tut); - - new Thread(() => - { - - - int tutPos = 0; - Action ondec = () => - { - tutPos++; - }; - TerminalBackend.CommandProcessed += (o, a) => - { - switch (tutPos) - { - - case 0: - case 10: - if (o.ToLower().StartsWith("mud.disconnect")) - { - tutPos++; - } - break; - case 11: - if (o.ToLower().StartsWith("krnl.lock_session")) - tutPos++; - break; - case 1: - if (o.ToLower().StartsWith("hacker101.brute_decrypt")) - { - if (a.Contains("0:/system/data/kernel.log")) - { - tutPos++; - } - } - break; - case 3: - if (o.ToLower().StartsWith("krnl.control")) - { - tutPos++; - } - break; - case 4: - if (o.ToLower().StartsWith("puppy.clear")) - tutPos++; - break; - case 5: - if (o.ToLower().StartsWith("mud.reconnect")) - tutPos++; - break; - case 6: - if (o.ToLower().StartsWith("mud.sendmsg")) - { - var msg = JsonConvert.DeserializeObject(a); - try - { - if (msg.header == "getusers" && msg.body == "dead") - tutPos++; - } - catch - { - - } - } - break; - case 7: - if (o.ToLower().StartsWith("hacker101.breach_user_password")) - tutPos++; - break; - case 8: - if (o.ToLower().StartsWith("hacker101.print_user_info")) - tutPos++; - break; - case 9: - if (o.ToLower().StartsWith("hacker101.steal_codepoints")) - tutPos++; - break; - } - }; - tut.SetObjective("Welcome to the dead account exploitation tutorial. In this tutorial you will learn the basics of hacking within the multi-user domain."); - Thread.Sleep(1000); - tut.SetObjective("We will start with a simple system exploit - gaining kernel-level access to ShiftOS. This can help you perform actions not ever possible in the user level."); - Thread.Sleep(1000); - tut.SetObjective("To gain root access, you will first need to breach the system watchdog to keep it from dialing home to DevX."); - Thread.Sleep(1000); - tut.SetObjective("The watchdog can only function when it has a successful connection to the multi-user domain. You will need to use the MUD Control Centre to disconnect yourself from the MUD. This will lock you out of most features. To disconnect from the multi-user domain, simply run the 'mud.disconnect' command."); - while(tutPos == 0) - { - - } - tut.SetObjective("As you can see, the kernel watchdog has shut down temporarily, however before the disconnect it was able to tell DevX that it has gone offline."); - Thread.Sleep(1000); - tut.SetObjective("You'll also notice that commands like the shiftorium, MUD control centre and various applications that utilize these system components no longer function."); - Thread.Sleep(1000); - tut.SetObjective("The watchdog, however, is still watching. DevX was smart and programmed the kernel to log all events to a local file in 0:/system/data/kernel.log."); - Thread.Sleep(1000); - tut.SetObjective("You will need to empty out this file before you can connect to the multi-user domain, as the watchdog will send the contents of this file straight to DevX."); - Thread.Sleep(1000); - tut.SetObjective("Or, you can do what we're about to do and attempt to decrypt the log and sniff out the kernel-mode access password."); - Thread.Sleep(1000); - tut.SetObjective("This will allow us to gain kernel-level access to our system using the krnl.control{pass:} command."); - Thread.Sleep(1000); - tut.SetObjective("Let's start decrypting the log file using the hacker101.brute_decrypt{file:} script. The file: argument is a string and should point to a .log file. When the script succeeds, you will see a TextPad open with the decrypted contents."); - while(tutPos == 1) - { - - } - onCompleteDecrypt += ondec; - tut.SetObjective("This script isn't the most agile script ever, but it'll get the job done."); - tutPos = 3; // For some reason, it refuses to go to part 3. - while(tutPos == 2) - { - - } - onCompleteDecrypt -= ondec; - tut.SetObjective("Alright - it's done. Here's how it's laid out. In each log entry, you have the timestamp, then the event name, then the event description."); - Thread.Sleep(1000); - tut.SetObjective("Look for the most recent 'mudhandshake' event. This contains the kernel access code."); - Thread.Sleep(1000); - tut.SetObjective("Once you have it, run 'krnl.control{pass:\"the-kernel-code-here\"}. This will allow you to gain access to the kernel."); - while(tutPos == 3) - { - - } - tut.SetObjective("You are now in kernel mode. Every command you enter will run on the kernel. Now, let's clear the watchdog's logfile and reconnect to the multi-user domain."); - Thread.Sleep(1000); - tut.SetObjective("To clear the log, simply run 'puppy.clear'."); - while(tutPos == 4) - { - - } - tut.SetObjective("Who's a good dog... You are, ShiftOS. Now, we can connect back to the MUD using 'mud.reconnect'."); - Thread.Sleep(1000); - while(tutPos == 5) - { - - } - tut.SetObjective("We have now snuck by the watchdog and DevX has no idea. With kernel-level access, everything you do is not logged, however if you perform too much in one shot, you'll get kicked off and locked out of the multi-user domain temporarily."); - Thread.Sleep(1000); - tut.SetObjective("So, let's focus on the job. You want to get into one of those fancy dead accounts, don't ya? Well, first, we need to talk with the MUD to get a list of these accounts."); - Thread.Sleep(1000); - tut.SetObjective("Simply run the `mud.sendmsg` command, specifying a 'header' of \"getusers\", and a body of \"dead\"."); - while(tutPos == 6) - { - - } - tut.SetObjective("Great. We now have the usernames and sysnames of all dead accounts on the MUD. Now let's use the hacker101.breach_user_password{user:,sys:} command to breach one of these accounts' passwords."); - while(tutPos == 7) - { - - } - tut.SetObjective("There - you now have access to that account. Use its password, username and sysname and run the hacker101.print_user_info{user:,pass:,sys:} command to print the entirety of this user's information."); - while(tutPos == 8) - { - - } - tut.SetObjective("Now you can see a list of the user's Codepoints among other things. Now you can steal their codepoints by using the hacker101.steal_codepoints{user:,pass:,sys;,amount:} command. Be careful. This may alert DevX."); - while(tutPos == 9) - { - - } - if(devx_alerted == true) - { - tut.SetObjective("Alright... enough fun and games. DevX just found out we were doing this."); - Thread.Sleep(500); - tut.SetObjective("Quick! Disconnect from the MUD!!"); - while(tutPos == 10) - { - - } - tut.SetObjective("Now, get out of kernel mode! To do that, run krnl.lock_session."); - while(tutPos == 11) - { - - } - - } - else - { - tut.SetObjective("OK, that was risky, but we pulled it off. Treat yourself! But first, let's get you out of kernel mode."); - Thread.Sleep(500); - tut.SetObjective("First we need to get you off the MUD. Simply run mud.disconnect again."); - while (tutPos == 10) - { - - } - tut.SetObjective("Now, let's run krnl.lock_session. This will lock you back into the user mode, and reconnect you to the MUD."); - while (tutPos == 11) - { - - } - tut.SetObjective("If, for some reason, DevX DOES find out, you have to be QUICK to get off of kernel mode. You don't want to make him mad."); - } - - Thread.Sleep(1000); - tut.SetObjective("So that's all for now. Whenever you're in kernel mode again, and you have access to a user account, try breaching their filesystem next time. You can use sos.help{ns:} to show commands from a specific namespace to help you find more commands easily."); - Thread.Sleep(1000); - tut.SetObjective("You can now close this window."); - tut.IsComplete = true; - - }).Start(); - }); - } - - private static bool devx_alerted = false; - - private static event Action onCompleteDecrypt; - - private static bool terminalIsOpen() - { - foreach(var win in AppearanceManager.OpenForms) - { - if (win.ParentWindow is Terminal) - return true; - } - return false; - } - - const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_"; - - [MultiplayerOnly] - [Command("breach_user_password")] - [KernelMode] - [RequiresArgument("user")] - [RequiresArgument("sys")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool BreachUserPassword(Dictionary args) - { - string usr = args["user"].ToString(); - string sys = args["sys"].ToString(); - ServerMessageReceived msgReceived = null; - - Console.WriteLine("--hooking system thread..."); - - msgReceived = (msg) => - { - if(msg.Name == "user_data") - { - var sve = JsonConvert.DeserializeObject(msg.Contents); - var rnd = new Random(); - var sw = new Stopwatch(); - sw.Start(); - Thread.Sleep(2000); - if(rnd.Next(0, 100) >= 75) - { - Console.WriteLine("--operation took too long - failed."); - ServerManager.SendMessage("mud_save_allow_dead", JsonConvert.SerializeObject(sve)); - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrefixEnabled = true; - return; - } - sw.Stop(); - Console.WriteLine(sve.Password); - Console.WriteLine(); - Console.WriteLine("--password breached. Operation took " + sw.ElapsedMilliseconds + " milliseconds."); - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - } - else if(msg.Name == "user_data_not_found") - { - Console.WriteLine("--access denied."); - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - } - TerminalBackend.PrefixEnabled = true; - }; - - Console.WriteLine("--beginning brute-force attack on " + usr + "@" + sys + "..."); - ServerManager.MessageReceived += msgReceived; - - ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new - { - user = usr, - sysname = sys - })); - TerminalBackend.PrefixEnabled = false; - Thread.Sleep(500); - return true; - } - - - [MultiplayerOnly] - [Command("print_user_info")] - [KernelMode] - [RequiresArgument("pass")] - [RequiresArgument("user")] - [RequiresArgument("sys")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool PrintUserInfo(Dictionary args) - { - string usr = args["user"].ToString(); - string sys = args["sys"].ToString(); - string pass = args["pass"].ToString(); - ServerMessageReceived msgReceived = null; - - Console.WriteLine("--hooking multi-user domain response call..."); - - msgReceived = (msg) => - { - if (msg.Name == "user_data") - { - var sve = JsonConvert.DeserializeObject(msg.Contents); - if(sve.Password == pass) - { - Console.WriteLine("Username: " + SaveSystem.CurrentUser.Username); - Console.WriteLine("Password: " + sve.Password); - Console.WriteLine("System name: " + sve.SystemName); - Console.WriteLine(); - Console.WriteLine("Codepoints: " + sve.Codepoints.ToString()); - - } - else - { - Console.WriteLine("--access denied."); - } - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - - } - else if (msg.Name == "user_data_not_found") - { - Console.WriteLine("--access denied."); - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - } - TerminalBackend.PrefixEnabled = true; - }; - - Console.WriteLine("--contacting multi-user domain..."); - ServerManager.MessageReceived += msgReceived; - - ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new - { - user = usr, - sysname = sys - })); - Thread.Sleep(500); - TerminalBackend.PrefixEnabled = false; - return true; - } - - [MultiplayerOnly] - [Command("steal_codepoints")] - [KernelMode] - [RequiresArgument("amount")] - [RequiresArgument("pass")] - [RequiresArgument("user")] - [RequiresArgument("sys")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool StealCodepoints(Dictionary args) - { - string usr = args["user"].ToString(); - string sys = args["sys"].ToString(); - string pass = args["pass"].ToString(); - ulong amount = (ulong)args["amount"]; - if(amount < 0) - { - Console.WriteLine("--invalid codepoint amount - halting..."); - return true; - } - - ServerMessageReceived msgReceived = null; - - Console.WriteLine("--hooking multi-user domain response call..."); - - msgReceived = (msg) => - { - if (msg.Name == "user_data") - { - var sve = JsonConvert.DeserializeObject(msg.Contents); - if (sve.Password == pass) - { - if(amount > sve.Codepoints) - { - Console.WriteLine("--can't steal this many codepoints from user."); - ServerManager.SendMessage("mud_save_allow_dead", JsonConvert.SerializeObject(sve)); - TerminalBackend.PrefixEnabled = true; - return; - } - - sve.Codepoints -= amount; - SaveSystem.TransferCodepointsFrom(SaveSystem.CurrentUser.Username, amount); - ServerManager.SendMessage("mud_save_allow_dead", JsonConvert.SerializeObject(sve)); - SaveSystem.SaveGame(); - } - else - { - Console.WriteLine("--access denied."); - } - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - } - else if (msg.Name == "user_data_not_found") - { - Console.WriteLine("--access denied."); - ServerManager.MessageReceived -= msgReceived; - TerminalBackend.PrintPrompt(); - } - TerminalBackend.PrefixEnabled = true; - }; - - Console.WriteLine("--contacting multi-user domain..."); - Thread.Sleep(500); - ServerManager.MessageReceived += msgReceived; - - ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new - { - user = usr, - sysname = sys - })); - Thread.Sleep(500); - TerminalBackend.PrefixEnabled = false; - return true; - } - - [MultiplayerOnly] - [Command("purge_user")] - [KernelMode] - [RequiresArgument("pass")] - [RequiresArgument("user")] - [RequiresArgument("sys")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool PurgeUser(Dictionary args) - { - string usr = args["user"].ToString(); - string sys = args["sys"].ToString(); - string pass = args["pass"].ToString(); - ServerMessageReceived msgReceived = null; - - Console.WriteLine("--hooking multi-user domain response call..."); - - msgReceived = (msg) => - { - if (msg.Name == "user_data") - { - var sve = JsonConvert.DeserializeObject(msg.Contents); - if (sve.Password == pass) - { - ServerManager.SendMessage("delete_dead_save", JsonConvert.SerializeObject(sve)); - Console.WriteLine(" User purged successfully."); - } - else - { - Console.WriteLine("--access denied."); - } - ServerManager.MessageReceived -= msgReceived; - } - else if (msg.Name == "user_data_not_found") - { - Console.WriteLine("--access denied."); - ServerManager.MessageReceived -= msgReceived; - } - TerminalBackend.PrintPrompt(); - TerminalBackend.PrefixEnabled = true; - }; - - Console.WriteLine("--contacting multi-user domain..."); - Thread.Sleep(500); - ServerManager.MessageReceived += msgReceived; - - ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new - { - user = usr, - sysname = sys - })); - Thread.Sleep(500); - TerminalBackend.PrefixEnabled = false; - return true; - } - - - [Command("brute_decrypt", true)] - [RequiresArgument("file")] - public static bool BruteDecrypt(Dictionary args) - { - if (FileExists(args["file"].ToString())) - { - string pass = new Random().Next(1000, 10000).ToString(); - string fake = ""; - Console.WriteLine("Beginning brute-force attack on password."); - var s = new Stopwatch(); - s.Start(); - for(int i = 0; i < pass.Length; i++) - { - for(int num = 0; num < 10; num++) - { - if(pass[i].ToString() == num.ToString()) - { - fake += num.ToString(); - Console.Write(num); - } - } - } - s.Stop(); - - Console.WriteLine("...password cracked - operation took " + s.ElapsedMilliseconds + " milliseconds."); - var tp = new TextPad(); - AppearanceManager.SetupWindow(tp); - WriteAllText("0:/temp.txt", ReadAllText(args["file"].ToString())); - tp.LoadFile("0:/temp.txt"); - Delete("0:/temp.txt"); - onCompleteDecrypt?.Invoke(); - } - else - { - Console.WriteLine("brute_decrypt: file not found"); - } - return true; - } - } - - [MultiplayerOnly] - [Namespace("storydev")] - public static class StoryDevCommands - { - [Command("start", description = "Starts a story plot.", usage ="id:string")] - [RequiresArgument("id")] - [RemoteLock] - public static bool StartStory(Dictionary args) - { - Story.Start(args["id"].ToString()); - return true; - } - - [Command("list", description ="Lists all story IDs.")] - public static bool ListIds() - { - foreach(var type in ReflectMan.Types) - foreach(var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) - { - var attr = method.GetCustomAttributes(false).FirstOrDefault(x => x is StoryAttribute); - if (attr != null) - Console.WriteLine(" - " + (attr as StoryAttribute).StoryID); - } - return true; - } - - [Command("unexperience", description = "Marks a story plot as not-experienced yet.", usage ="id:string")] - [RemoteLock] - [RequiresArgument("id")] - public static bool Unexperience(Dictionary args) - { - string id = args["id"].ToString(); - if (SaveSystem.CurrentSave.StoriesExperienced.Contains(id)) - { - Console.WriteLine("Unexperiencing " + id + "."); - SaveSystem.CurrentSave.StoriesExperienced.Remove(id); - SaveSystem.SaveGame(); - } - else - { - Console.WriteLine("Story ID not found."); - } - - return true; - } - - [Command("experience", description = "Marks a story plot as experienced without triggering the plot.", usage ="{id:}")] - [RequiresArgument("id")] - [RemoteLock] - public static bool Experience(Dictionary args) - { - SaveSystem.CurrentSave.StoriesExperienced.Add(args["id"].ToString()); - SaveSystem.SaveGame(); - return true; - } - } -} + \ No newline at end of file diff --git a/ShiftOS.WinForms/OobeStory.cs b/ShiftOS.WinForms/OobeStory.cs index cab1ec8..0d9b817 100644 --- a/ShiftOS.WinForms/OobeStory.cs +++ b/ShiftOS.WinForms/OobeStory.cs @@ -13,7 +13,6 @@ using ShiftOS.Objects; namespace ShiftOS.WinForms { - [Namespace("test")] public class OobeStory { [Command("test")] diff --git a/ShiftOS.WinForms/Servers/RemoteTerminalServer.cs b/ShiftOS.WinForms/Servers/RemoteTerminalServer.cs index d57e28f..849049f 100644 --- a/ShiftOS.WinForms/Servers/RemoteTerminalServer.cs +++ b/ShiftOS.WinForms/Servers/RemoteTerminalServer.cs @@ -10,7 +10,6 @@ using ShiftOS.Objects; namespace ShiftOS.WinForms.Servers { - [Namespace("rts")] [Server("Remote Terminal Server", 21)] //[RequiresUpgrade("story_hacker101_breakingthebonds")] //Uncomment when story is implemented. public class RemoteTerminalServer : Server diff --git a/ShiftOS.WinForms/ShiftOS.WinForms.csproj b/ShiftOS.WinForms/ShiftOS.WinForms.csproj index 9e16b19..00b4d83 100644 --- a/ShiftOS.WinForms/ShiftOS.WinForms.csproj +++ b/ShiftOS.WinForms/ShiftOS.WinForms.csproj @@ -131,12 +131,6 @@ Chat.cs - - UserControl - - - CoherenceOverlay.cs - UserControl diff --git a/ShiftOS.WinForms/SkinCommands.cs b/ShiftOS.WinForms/SkinCommands.cs index 1f32d96..f35c449 100644 --- a/ShiftOS.WinForms/SkinCommands.cs +++ b/ShiftOS.WinForms/SkinCommands.cs @@ -9,7 +9,6 @@ using ShiftOS.Objects.ShiftFS; namespace ShiftOS.WinForms { - [Namespace("skins")] public static class SkinCommands { [Command("reset")] diff --git a/ShiftOS.WinForms/TestCommandsForUpgrades.cs b/ShiftOS.WinForms/TestCommandsForUpgrades.cs index 739a2a2..5f28270 100644 --- a/ShiftOS.WinForms/TestCommandsForUpgrades.cs +++ b/ShiftOS.WinForms/TestCommandsForUpgrades.cs @@ -1,21 +1 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ShiftOS.Engine; - -namespace ShiftOS.WinForms -{ - [Namespace("test")] - public static class TestCommandsForUpgrades - { - [Command("simpletest")] - public static bool Simple() - { - return true; - } - } - - -} + \ No newline at end of file diff --git a/ShiftOS.WinForms/TrailerCommands.cs b/ShiftOS.WinForms/TrailerCommands.cs index 182d03d..e69de29 100644 --- a/ShiftOS.WinForms/TrailerCommands.cs +++ b/ShiftOS.WinForms/TrailerCommands.cs @@ -1,48 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#define TRAILER -#if TRAILER -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ShiftOS.Engine; - -namespace ShiftOS.WinForms -{ - [Namespace("trailer")] - public static class TrailerCommands - { - [Command("init")] - public static bool TrailerInit() - { - var oobe = new Oobe(); - oobe.StartTrailer(); - return true; - } - } -} -#endif \ No newline at end of file diff --git a/ShiftOS.WinForms/WinformsDesktop.cs b/ShiftOS.WinForms/WinformsDesktop.cs index f6c4383..82d99f0 100644 --- a/ShiftOS.WinForms/WinformsDesktop.cs +++ b/ShiftOS.WinForms/WinformsDesktop.cs @@ -47,7 +47,6 @@ namespace ShiftOS.WinForms /// /// Winforms desktop. /// - [Namespace("desktop")] public partial class WinformsDesktop : Form, IDesktop { public MainMenu.MainMenu ParentMenu = null; diff --git a/ShiftOS_TheReturn/Command.cs b/ShiftOS_TheReturn/Command.cs index 09cf206..b90f604 100644 --- a/ShiftOS_TheReturn/Command.cs +++ b/ShiftOS_TheReturn/Command.cs @@ -135,42 +135,6 @@ namespace ShiftOS.Engine } } - /// - /// Denotes a Terminal command namespace. - /// - public class Namespace : Attribute - { - /// - /// The namespace's name. - /// - public string name; - /// - /// Whether the namespace should be hidden from the help system. Overrides all child s' hide values. - /// - public bool hide; - - /// - /// Creates a new instance of the . - /// - /// The name of the namespace. - public Namespace(string n) - { - name = n; - } - - - /// - /// Creates a new instance of the . - /// - /// The name of the namespace. - /// Whether this namespace should be hidden from the user. - public Namespace(string n, bool hide) - { - name = n; - this.hide = hide; - } - } - /// /// Marks a Terminal command as obsolete. /// diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index 6f3ab15..9221bba 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -44,7 +44,6 @@ using ShiftOS.Objects.ShiftFS; namespace ShiftOS.Engine { - [Namespace("infobox", hide = true)] [RequiresUpgrade("desktop;wm_free_placement")] public static class InfoboxDebugCommands { @@ -107,7 +106,6 @@ namespace ShiftOS.Engine } - [Namespace("audio")] public static class AudioCommands { [Command("setvol", description = "Set the volume of the system audio to anywhere between 0 and 100.")] @@ -129,79 +127,7 @@ namespace ShiftOS.Engine } } - [RequiresUpgrade("mud_fundamentals")] - [Namespace("mud")] - public static class MUDCommands - { - [MultiplayerOnly] - [Command("status")] - public static bool Status() - { - ServerManager.PrintDiagnostics(); - return true; - } - - [Command("connect")] - public static bool Connect(Dictionary args) - { - try - { - string ip = (args.ContainsKey("addr") == true) ? args["addr"] as string : "michaeltheshifter.me"; - int port = (args.ContainsKey("port") == true) ? Convert.ToInt32(args["port"] as string) : 13370; - try - { - ServerManager.Initiate(ip, port); - } - catch (Exception ex) - { - Console.WriteLine("{ERROR}: " + ex.Message); - } - - TerminalBackend.PrefixEnabled = false; - return true; - } - catch (Exception ex) - { - Console.WriteLine("Error running script:" + ex); - return false; - } - } - - [Command("reconnect")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool Reconnect() - { - Console.WriteLine("--reconnecting to multi-user domain..."); - KernelWatchdog.MudConnected = true; - Console.WriteLine("--done."); - return true; - } - - [MultiplayerOnly] - [Command("disconnect")] - [RequiresUpgrade("hacker101_deadaccts")] - public static bool Disconnect() - { - Console.WriteLine("--connection to multi-user domain severed..."); - KernelWatchdog.MudConnected = false; - return true; - } - - [MultiplayerOnly] - [Command("sendmsg")] - [KernelMode] - [RequiresUpgrade("hacker101_deadaccts")] - [RequiresArgument("header")] - [RequiresArgument("body")] - public static bool SendMessage(Dictionary args) - { - ServerManager.SendMessage(args["header"].ToString(), args["body"].ToString()); - return true; - } - } - [TutorialLock] - [Namespace("trm")] public static class TerminalCommands { [Command("clear")] @@ -220,167 +146,6 @@ namespace ShiftOS.Engine } } -#if DEVEL - internal class Rock : Exception - { - internal Rock() : base("Someone threw a rock at the window, and the Terminal shattered.") - { - - } - } - - [MultiplayerOnly] - [Namespace("dev")] - public static class ShiftOSDevCommands - { - [Command("buy")] - public static bool UnlockUpgrade(Dictionary args) - { - string upg = args["id"].ToString(); - try - { - SaveSystem.CurrentSave.Upgrades[upg] = true; - Shiftorium.InvokeUpgradeInstalled(); - SaveSystem.SaveGame(); - } - catch - { - Console.WriteLine("Upgrade not found."); - } - return true; - } - - [Command("rock", description = "A little surprise for unstable builds...")] - public static bool ThrowASandwichingRock() - { - Infobox.Show("He who lives in a glass house shouldn't throw stones...", new Rock().Message); - return false; - } - - - [Command("unbuy")] - [RequiresArgument("upgrade")] - public static bool UnbuyUpgrade(Dictionary args) - { - try - { - SaveSystem.CurrentSave.Upgrades[args["upgrade"].ToString()] = false; - SaveSystem.SaveGame(); - Desktop.PopulateAppLauncher(); - Desktop.CurrentDesktop.SetupDesktop(); - } - catch - { - Console.WriteLine("Upgrade not found."); - } - return true; - } - - [Command("getallupgrades")] - public static bool GetAllUpgrades() - { - Console.WriteLine(JsonConvert.SerializeObject(SaveSystem.CurrentSave.Upgrades, Formatting.Indented)); - return true; - } - - [Command("multarg")] - [RequiresArgument("id")] - [RequiresArgument("name")] - [RequiresArgument("type")] - public static bool MultArg(Dictionary args) - { - Console.WriteLine("Success! "+args.ToString()); - return true; - } - - [Command("restart")] - public static bool Restart() - { - SaveSystem.CurrentSave.Upgrades = new Dictionary(); - SaveSystem.CurrentSave.Codepoints = 0; - SaveSystem.CurrentSave.StoriesExperienced.Clear(); - SaveSystem.CurrentSave.StoriesExperienced.Add("mud_fundamentals"); - SaveSystem.SaveGame(); - Shiftorium.InvokeUpgradeInstalled(); - return true; - } - - [Command("freecp")] - public static bool FreeCodepoints(Dictionary args) - { - if (args.ContainsKey("amount")) - try - { - ulong codepointsToAdd = Convert.ToUInt64(args["amount"].ToString()); - SaveSystem.CurrentSave.Codepoints += codepointsToAdd; - return true; - } - catch (Exception ex) - { - Console.WriteLine("{ERROR}: " + ex.Message); - return true; - } - - SaveSystem.CurrentSave.Codepoints += 1000; - return true; - } - - [Command("unlockeverything")] - public static bool UnlockAllUpgrades() - { - foreach (var upg in Shiftorium.GetDefaults()) - { - if (!SaveSystem.CurrentSave.Upgrades.ContainsKey(upg.ID)) - SaveSystem.CurrentSave.Upgrades.Add(upg.ID, true); - else - SaveSystem.CurrentSave.Upgrades[upg.ID] = true; - } - Shiftorium.InvokeUpgradeInstalled(); - SkinEngine.LoadSkin(); - return true; - } - - [Command("info")] - public static bool DevInformation() - { - Console.WriteLine("{SHIFTOS_PLUS_MOTTO}"); - Console.WriteLine("{SHIFTOS_VERSION_INFO}" + Assembly.GetExecutingAssembly().GetName().Version); - return true; - } - [Command("pullfile")] - public static bool PullFile(Dictionary args) - { - if (args.ContainsKey("physical") && args.ContainsKey("virtual")) - { - string file = (string)args["physical"]; - string dest = (string)args["virtual"]; - if (System.IO.File.Exists(file)) - { - Console.WriteLine("Pulling physical file to virtual drive..."); - byte[] filebytes = System.IO.File.ReadAllBytes(file); - ShiftOS.Objects.ShiftFS.Utils.WriteAllBytes(dest, filebytes); - } - else - { - Console.WriteLine("The specified file does not exist on the physical drive."); - } - } - else - { - Console.WriteLine("You must supply a physical path."); - } - return true; - } - [Command("crash")] - public static bool CrashInstantly() - { - CrashHandler.Start(new Exception("ShiftOS was sent a command to forcefully crash.")); - return true; - } - } -#endif - - [Namespace("sos")] public static class ShiftOSCommands { @@ -478,38 +243,17 @@ namespace ShiftOS.Engine } [Command("help", "{COMMAND_HELP_USAGE", "{COMMAND_HELP_DESCRIPTION}")] - public static bool Help(Dictionary args) + public static bool Help() { var sb = new StringBuilder(); sb.AppendLine("Retrieving help data."); - - if (args.ContainsKey("ns")) + //print all unique namespaces. + foreach (var n in TerminalBackend.Commands.Select(x => x.CommandInfo).Distinct().OrderBy(x=>x.name)) { - string ns = args["ns"].ToString(); - //First let's check for a command that has this namespace. - var cmdtest = TerminalBackend.Commands.FirstOrDefault(x => x.NamespaceInfo.name == ns); - if (cmdtest == null) //Namespace not found. - sb.AppendLine("Error retrieving help for namespace \"" + ns + "\". Namespace not found."); - else - { - //Now do the actual scan. - sb.AppendLine("Namespace: " + ns); - foreach(var cmd in TerminalBackend.Commands.Where(x => x.NamespaceInfo.name == ns)) - { - string str = cmd.ToString(); - str = str.Replace(str.Substring(str.LastIndexOf("|")), ""); - sb.AppendLine(str); - } - } - } - else - { - - //print all unique namespaces. - foreach(var n in TerminalBackend.Commands.Select(x => x.NamespaceInfo.name).Distinct()) - { - sb.AppendLine("sos.help{ns:\"" + n + "\"}"); - } + sb.Append(n.name); + if (Shiftorium.UpgradeInstalled("help_descriptions")) + sb.Append(" - " + n.description); + sb.AppendLine(); } Console.WriteLine(sb.ToString()); @@ -565,7 +309,6 @@ Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed, } [MultiplayerOnly] - [Namespace("shiftorium")] public static class ShiftoriumCommands { [Command("buy")] @@ -668,7 +411,7 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); return true; } - [Command("list")] + [Command("shiftorium", description ="Lists all available Shiftorium upgrades.")] public static bool ListAll(Dictionary args) { try @@ -742,7 +485,6 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); } } - [Namespace("win")] public static class WindowCommands { diff --git a/ShiftOS_TheReturn/PythonAPI.cs b/ShiftOS_TheReturn/PythonAPI.cs index cc3798c..7db4c45 100644 --- a/ShiftOS_TheReturn/PythonAPI.cs +++ b/ShiftOS_TheReturn/PythonAPI.cs @@ -291,7 +291,6 @@ namespace ShiftOS.Engine } #if DEBUG - [Namespace("dev")] public static class PythonCmds { [Command("runpystring", description = "Run some Python code. (Only present in DEBUG builds of ShiftOS)")] diff --git a/ShiftOS_TheReturn/ReflectMan.cs b/ShiftOS_TheReturn/ReflectMan.cs index 78f6bf3..d194754 100644 --- a/ShiftOS_TheReturn/ReflectMan.cs +++ b/ShiftOS_TheReturn/ReflectMan.cs @@ -104,7 +104,6 @@ namespace ShiftOS.Engine } #if DEBUG - [Namespace("dev")] public static class ReflectDebug { [Command("listalltypes", description = "List all types that were found by ReflectMan. Only present in DEBUG builds of ShiftOS.")] diff --git a/ShiftOS_TheReturn/TerminalBackend.cs b/ShiftOS_TheReturn/TerminalBackend.cs index 81ea971..4594eb3 100644 --- a/ShiftOS_TheReturn/TerminalBackend.cs +++ b/ShiftOS_TheReturn/TerminalBackend.cs @@ -148,7 +148,6 @@ namespace ShiftOS.Engine return hash; } - public Namespace NamespaceInfo { get; set; } public Command CommandInfo { get; set; } public List RequiredArguments { get; set; } @@ -161,16 +160,14 @@ namespace ShiftOS.Engine public override string ToString() { StringBuilder sb = new StringBuilder(); - sb.Append(this.NamespaceInfo.name); - sb.Append("."); sb.Append(this.CommandInfo.name); if (this.RequiredArguments.Count > 0) { - sb.Append("{"); + sb.Append(" "); foreach (var arg in RequiredArguments) { - sb.Append(arg); - sb.Append(":"); + sb.Append("--" + arg); + sb.Append(" "); if (RequiredArguments.IndexOf(arg) < RequiredArguments.Count - 1) sb.Append(','); } @@ -295,41 +292,42 @@ namespace ShiftOS.Engine public static void PopulateTerminalCommands() { Commands = new List(); - foreach(var type in ReflectMan.Types) + foreach (var type in ReflectMan.Types) { - var ns = type.GetCustomAttributes(false).FirstOrDefault(x => x is Namespace) as Namespace; - if(ns != null) + foreach (var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) { - foreach(var mth in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) + var cmd = mth.GetCustomAttributes(false).FirstOrDefault(x => x is Command); + if (cmd != null) { - var cmd = mth.GetCustomAttributes(false).FirstOrDefault(x => x is Command); - if(cmd != null) - { - var tc = new TerminalCommand(); - tc.RequiresElevation = !(type.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); + var tc = new TerminalCommand(); + tc.RequiresElevation = !(type.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); - tc.NamespaceInfo = ns; - tc.CommandInfo = cmd as Command; - tc.RequiresElevation = tc.RequiresElevation || !(mth.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); - tc.RequiredArguments = new List(); - foreach (var arg in mth.GetCustomAttributes(false).Where(x=>x is RequiresArgument)) - { - var rarg = arg as RequiresArgument; - tc.RequiredArguments.Add(rarg.argument); - } - var rupg = mth.GetCustomAttributes(false).FirstOrDefault(x => x is RequiresUpgradeAttribute) as RequiresUpgradeAttribute; - if (rupg != null) - tc.Dependencies = rupg.Upgrade; - else - tc.Dependencies = ""; - tc.CommandType = type; - tc.CommandHandler = mth; - if (!Commands.Contains(tc)) - Commands.Add(tc); + tc.CommandInfo = cmd as Command; + tc.RequiresElevation = tc.RequiresElevation || !(mth.GetCustomAttributes(false).FirstOrDefault(x => x is KernelModeAttribute) == null); + tc.RequiredArguments = new List(); + foreach (var arg in mth.GetCustomAttributes(false).Where(x => x is RequiresArgument)) + { + var rarg = arg as RequiresArgument; + tc.RequiredArguments.Add(rarg.argument); } + var rupg = mth.GetCustomAttributes(false).FirstOrDefault(x => x is RequiresUpgradeAttribute) as RequiresUpgradeAttribute; + if (rupg != null) + tc.Dependencies = rupg.Upgrade; + else + tc.Dependencies = ""; + tc.CommandType = type; + tc.CommandHandler = mth; + + var ambiguity = Commands.FirstOrDefault(x => x.CommandInfo.name == tc.CommandInfo.name); + if (ambiguity != null) + throw new Exception("Command ambiguity error. You can't have two commands with the same name: " + $"{tc} == {ambiguity}"); + + if (!Commands.Contains(tc)) + Commands.Add(tc); } } + } Console.WriteLine("[termdb] " + Commands.Count + " commands found."); } @@ -465,7 +463,7 @@ namespace ShiftOS.Engine string[] split = text.Split('.'); - var cmd = Commands.FirstOrDefault(x => x.NamespaceInfo.name == split[0] && x.CommandInfo.name == split[1]); + var cmd = Commands.FirstOrDefault(x => x.CommandInfo.name == text); if (cmd == null) return false; if (!Shiftorium.UpgradeInstalled(cmd.Dependencies)) diff --git a/ShiftOS_TheReturn/UserManagementCommands.cs b/ShiftOS_TheReturn/UserManagementCommands.cs index a64c99c..cac535b 100644 --- a/ShiftOS_TheReturn/UserManagementCommands.cs +++ b/ShiftOS_TheReturn/UserManagementCommands.cs @@ -10,7 +10,6 @@ namespace ShiftOS.Engine /// /// Administrative user management terminal commands. /// - [Namespace("admin")] [KernelMode] [RequiresUpgrade("mud_fundamentals")] public static class AdminUserManagementCommands @@ -173,7 +172,6 @@ namespace ShiftOS.Engine /// /// Non-administrative user management terminal commands. /// - [Namespace("user")] [RequiresUpgrade("mud_fundamentals")] public static class UserManagementCommands { -- cgit v1.2.3