aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb2
-rw-r--r--ShiftOS.Server/Core.cs26
-rw-r--r--ShiftOS.Server/ShiftnetBackend.cs44
-rw-r--r--ShiftOS.WinForms/Applications/Artpad.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Chat.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Dialog.cs6
-rw-r--r--ShiftOS.WinForms/Applications/Downloader.cs1
-rw-r--r--ShiftOS.WinForms/Applications/FormatEditor.cs1
-rw-r--r--ShiftOS.WinForms/Applications/GraphicPicker.cs1
-rw-r--r--ShiftOS.WinForms/Applications/MUDControlCentre.cs1
-rw-r--r--ShiftOS.WinForms/Applications/NameChanger.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Pong.cs1
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLetters.cs6
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLotto.Designer.cs231
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLotto.cs134
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLotto.resx128
-rw-r--r--ShiftOS.WinForms/Applications/ShiftSweeper.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Shifter.cs28
-rw-r--r--ShiftOS.WinForms/Applications/Shiftnet.cs8
-rw-r--r--ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Terminal.cs29
-rw-r--r--ShiftOS.WinForms/Applications/TutorialBox.cs3
-rw-r--r--ShiftOS.WinForms/Controls/TerminalBox.cs50
-rw-r--r--ShiftOS.WinForms/HackerCommands.cs146
-rw-r--r--ShiftOS.WinForms/Properties/Resources.Designer.cs24
-rw-r--r--ShiftOS.WinForms/Properties/Resources.resx3
-rw-r--r--ShiftOS.WinForms/Resources/Shiftorium.txt14
-rw-r--r--ShiftOS.WinForms/ShiftOS.WinForms.csproj10
-rw-r--r--ShiftOS.WinForms/SystemIcons/iconShiftLotto.pngbin0 -> 299 bytes
-rw-r--r--ShiftOS.WinForms/Tools/ControlManager.cs42
-rw-r--r--ShiftOS.WinForms/WinformsDesktop.cs6
-rw-r--r--ShiftOS.WinForms/WinformsWindowManager.cs18
-rw-r--r--ShiftOS_TheReturn.sln12
-rw-r--r--ShiftOS_TheReturn/AppLauncherDaemon.cs20
-rw-r--r--ShiftOS_TheReturn/Commands.cs52
-rw-r--r--ShiftOS_TheReturn/ConsoleEx.cs28
-rw-r--r--ShiftOS_TheReturn/Infobox.cs6
-rw-r--r--ShiftOS_TheReturn/KernelWatchdog.cs64
-rw-r--r--ShiftOS_TheReturn/Scripting.cs53
-rw-r--r--ShiftOS_TheReturn/ServerManager.cs13
-rw-r--r--ShiftOS_TheReturn/ShiftOS.Engine.csproj1
-rw-r--r--ShiftOS_TheReturn/Skinning.cs4
-rw-r--r--ShiftOS_TheReturn/TerminalBackend.cs278
43 files changed, 1300 insertions, 199 deletions
diff --git a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
index 0a65a5e..161012d 100644
--- a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
+++ b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
@@ -206,7 +206,7 @@ Public Class SkinConverterCommands
skn.Header2Font = New Font("Microsoft Sans Serif", 15, FontStyle.Regular)
skn.Header3Font = New Font("Microsoft Sans Serif", 12.5, FontStyle.Regular)
- skn.TerminalBackColor = Color.Black
+ skn.TerminalBackColorCC = ConsoleColor.Black
Console.WriteLine(" ...done!")
Console.WriteLine("Skin conversion complete.")
diff --git a/ShiftOS.Server/Core.cs b/ShiftOS.Server/Core.cs
index 4ec421d..e14ca27 100644
--- a/ShiftOS.Server/Core.cs
+++ b/ShiftOS.Server/Core.cs
@@ -96,10 +96,11 @@ namespace ShiftOS.Server
{
Name = "run",
GUID = "Server",
- Contents = $@"{{
- script:""{File.ReadAllText($"scripts/{user}/{script}.lua").Replace("\"", "\\\"")}"",
- args:""{sArgs}""
- }}"
+ Contents = JsonConvert.SerializeObject(new
+ {
+ script = File.ReadAllText($"scripts/{user}/{script}.lua"),
+ args = sArgs
+ })
}));
}
else
@@ -115,7 +116,7 @@ namespace ShiftOS.Server
{
Name = "Error",
GUID = "Server",
- Contents = JsonConvert.SerializeObject(new MudException("Command parse error"))
+ Contents = JsonConvert.SerializeObject(new MudException("<script_runner> Script not found or script error detected."))
}));
}
catch
@@ -126,6 +127,17 @@ namespace ShiftOS.Server
}
+ [MudRequest("diag_log", typeof(string))]
+ public static void Diagnostic(string guid, string line)
+ {
+ List<string> lines = new List<string>();
+ if (File.Exists("diagnostics.log"))
+ lines = new List<string>(File.ReadAllLines("diagnostics.log"));
+
+ lines.Add(line);
+ File.WriteAllLines("diagnostics.log", lines.ToArray());
+ }
+
[MudRequest("getusers", typeof(string))]
public static void GetAllUsers(string guid, string contents)
{
@@ -182,8 +194,8 @@ namespace ShiftOS.Server
GUID = "server",
Contents = JsonConvert.SerializeObject(saveFile)
}));
+ return;
}
- return;
}
}
foreach (var sve in Directory.GetFiles("saves"))
@@ -199,8 +211,8 @@ namespace ShiftOS.Server
GUID = "server",
Contents = JsonConvert.SerializeObject(saveFile)
}));
+ return;
}
- return;
}
}
diff --git a/ShiftOS.Server/ShiftnetBackend.cs b/ShiftOS.Server/ShiftnetBackend.cs
index 60b3aa4..c7bf0e8 100644
--- a/ShiftOS.Server/ShiftnetBackend.cs
+++ b/ShiftOS.Server/ShiftnetBackend.cs
@@ -43,37 +43,49 @@ namespace ShiftOS.Server
string url = contents as string;
if (!url.StartsWith("shiftnet/"))
{
- server.DispatchTo(new Guid(guid), new NetObject("shiftnet_got", new ServerMessage
+ try
{
- Name = "shiftnet_file",
- GUID = "server",
- Contents = (File.Exists("badrequest.md") == true) ? File.ReadAllText("badrequest.md") : @"# Bad request.
+
+ server.DispatchTo(new Guid(guid), new NetObject("shiftnet_got", new ServerMessage
+ {
+ Name = "shiftnet_file",
+ GUID = "server",
+ Contents = (File.Exists("badrequest.md") == true) ? File.ReadAllText("badrequest.md") : @"# Bad request.
You have sent a bad request to the multi-user domain. Please try again."
- }));
+ }));
+ }
+ catch { }
return;
}
if (File.Exists(url))
{
- server.DispatchTo(new Guid(guid), new NetObject("download", new ServerMessage
+ try
{
- Name = "download_meta",
- GUID = "server",
- Contents = JsonConvert.SerializeObject(File.ReadAllBytes(url))
- }));
+ server.DispatchTo(new Guid(guid), new NetObject("download", new ServerMessage
+ {
+ Name = "download_meta",
+ GUID = "server",
+ Contents = JsonConvert.SerializeObject(File.ReadAllBytes(url))
+ }));
+ }
+ catch { }
}
else
{
- server.DispatchTo(new Guid(guid), new NetObject("shiftnet_got", new ServerMessage
+ try
{
- Name = "shiftnet_file",
- GUID = "server",
- Contents = (File.Exists("notfound.md") == true) ? File.ReadAllText("notfound.md") : @"# Not found.
+ server.DispatchTo(new Guid(guid), new NetObject("shiftnet_got", new ServerMessage
+ {
+ Name = "shiftnet_file",
+ GUID = "server",
+ Contents = (File.Exists("notfound.md") == true) ? File.ReadAllText("notfound.md") : @"# Not found.
The page you requested at was not found on this multi-user domain."
- }));
-
+ }));
+ }
+ catch { }
}
}
diff --git a/ShiftOS.WinForms/Applications/Artpad.cs b/ShiftOS.WinForms/Applications/Artpad.cs
index 6c1bc1c..71f7afb 100644
--- a/ShiftOS.WinForms/Applications/Artpad.cs
+++ b/ShiftOS.WinForms/Applications/Artpad.cs
@@ -41,6 +41,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Artpad", true, "al_artpad", "Graphics")]
[RequiresUpgrade("artpad")]
[WinOpen("artpad")]
diff --git a/ShiftOS.WinForms/Applications/Chat.cs b/ShiftOS.WinForms/Applications/Chat.cs
index 06a7873..caf8cd2 100644
--- a/ShiftOS.WinForms/Applications/Chat.cs
+++ b/ShiftOS.WinForms/Applications/Chat.cs
@@ -36,6 +36,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
public partial class Chat : UserControl, IShiftOSWindow
{
public Chat(string chatId)
diff --git a/ShiftOS.WinForms/Applications/Dialog.cs b/ShiftOS.WinForms/Applications/Dialog.cs
index 26e3040..11fbf1e 100644
--- a/ShiftOS.WinForms/Applications/Dialog.cs
+++ b/ShiftOS.WinForms/Applications/Dialog.cs
@@ -76,12 +76,16 @@ namespace ShiftOS.WinForms.Applications
btnok.Click += (o, a) =>
{
AppearanceManager.Close(this);
+ OpenCallback?.Invoke();
};
}
- public void Open(string title, string msg)
+ private Action OpenCallback = null;
+
+ public void Open(string title, string msg, Action c = null)
{
+ OpenCallback = c;
new Dialog().OpenInternal(title, msg);
}
diff --git a/ShiftOS.WinForms/Applications/Downloader.cs b/ShiftOS.WinForms/Applications/Downloader.cs
index da90c6d..1f240bf 100644
--- a/ShiftOS.WinForms/Applications/Downloader.cs
+++ b/ShiftOS.WinForms/Applications/Downloader.cs
@@ -41,6 +41,7 @@ using System.IO.Compression;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Downloader", false, null, "Networking")]
[DefaultIcon("iconDownloader")]
public partial class Downloader : UserControl, IShiftOSWindow
diff --git a/ShiftOS.WinForms/Applications/FormatEditor.cs b/ShiftOS.WinForms/Applications/FormatEditor.cs
index bf5e78c..c5afc02 100644
--- a/ShiftOS.WinForms/Applications/FormatEditor.cs
+++ b/ShiftOS.WinForms/Applications/FormatEditor.cs
@@ -34,6 +34,7 @@ using System.Windows.Forms;
using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications {
+ [MultiplayerOnly]
[Launcher("FormatEditor", true, "al_format_editor", "Games")]
[RequiresUpgrade("format_editor")]
[WinOpen("formateditor")]
diff --git a/ShiftOS.WinForms/Applications/GraphicPicker.cs b/ShiftOS.WinForms/Applications/GraphicPicker.cs
index 2dfe7ec..b3dd8bf 100644
--- a/ShiftOS.WinForms/Applications/GraphicPicker.cs
+++ b/ShiftOS.WinForms/Applications/GraphicPicker.cs
@@ -37,6 +37,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[DefaultTitle("Choose graphic")] [DefaultIcon("icongraphicpicker")]
public partial class GraphicPicker : UserControl, IShiftOSWindow
{
diff --git a/ShiftOS.WinForms/Applications/MUDControlCentre.cs b/ShiftOS.WinForms/Applications/MUDControlCentre.cs
index 02fe868..e2668bd 100644
--- a/ShiftOS.WinForms/Applications/MUDControlCentre.cs
+++ b/ShiftOS.WinForms/Applications/MUDControlCentre.cs
@@ -38,6 +38,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[RequiresUpgrade("mud_fundamentals")]
[Launcher("MUD Control Centre", true, "al_mud_control_centre", "Networking")]
[WinOpen("mud_control_centre")]
diff --git a/ShiftOS.WinForms/Applications/NameChanger.cs b/ShiftOS.WinForms/Applications/NameChanger.cs
index ca76e57..d7c99f7 100644
--- a/ShiftOS.WinForms/Applications/NameChanger.cs
+++ b/ShiftOS.WinForms/Applications/NameChanger.cs
@@ -38,6 +38,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications {
+ [MultiplayerOnly]
[Launcher("Name Changer", true, "al_name_changer", "Customization")]
[RequiresUpgrade("name_changer")]
[WinOpen("name_changer")]
diff --git a/ShiftOS.WinForms/Applications/Pong.cs b/ShiftOS.WinForms/Applications/Pong.cs
index af1e156..157ce8c 100644
--- a/ShiftOS.WinForms/Applications/Pong.cs
+++ b/ShiftOS.WinForms/Applications/Pong.cs
@@ -37,6 +37,7 @@ using ShiftOS.Objects;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Pong", true, "al_pong", "Games")]
[WinOpen("pong")]
[DefaultIcon("iconPong")]
diff --git a/ShiftOS.WinForms/Applications/ShiftLetters.cs b/ShiftOS.WinForms/Applications/ShiftLetters.cs
index f1c1d22..b5e9aa4 100644
--- a/ShiftOS.WinForms/Applications/ShiftLetters.cs
+++ b/ShiftOS.WinForms/Applications/ShiftLetters.cs
@@ -36,6 +36,7 @@ using System.Windows.Forms;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("ShiftLetters", false, null, "Games")]
[RequiresUpgrade("shiftletters")]
[WinOpen("shiftletters")]
@@ -50,7 +51,7 @@ namespace ShiftOS.WinForms.Applications
"shiftorium", "codepoints", "shiftletters", "shops", "mud", "notification", "namechanger",
"skinning", "skinloader", "calculator", "fileskimmer", "lua", "shiftnet", "terminal", "textpad"};
List<String> contributorsWordlist = new List<string> { "philipadams", "carverh", "computelinux", "lempamo",
- "wowmom", "michaeltheshifter", "arencclc", "therandommelon", "pfg", "craftxbox"};
+ "wowmom", "michaeltheshifter", "arencllc", "therandommelon", "pfg", "craftxbox", "ashifter"};
List<string> osWordlist = new List<string>
{
@@ -90,7 +91,8 @@ namespace ShiftOS.WinForms.Applications
"vienna",
"whistler",
"windowsxp",
- "windowsforworkgroups"
+ "windowsforworkgroups",
+ "shiftos"
};
public ShiftLetters()
diff --git a/ShiftOS.WinForms/Applications/ShiftLotto.Designer.cs b/ShiftOS.WinForms/Applications/ShiftLotto.Designer.cs
new file mode 100644
index 0000000..8b43636
--- /dev/null
+++ b/ShiftOS.WinForms/Applications/ShiftLotto.Designer.cs
@@ -0,0 +1,231 @@
+/*
+ * 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 ShiftLotto
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShiftLotto));
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.button1 = new System.Windows.Forms.Button();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.cpUpDown = new System.Windows.Forms.NumericUpDown();
+ this.difUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label1 = new System.Windows.Forms.Label();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.label7 = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.cpUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.difUpDown)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(19, 49);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(376, 39);
+ this.label2.TabIndex = 2;
+ this.label2.Text = resources.GetString("label2.Text");
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(35, 122);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(60, 13);
+ this.label3.TabIndex = 3;
+ this.label3.Text = "Codepoints\r\n";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(319, 122);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(47, 13);
+ this.label4.TabIndex = 4;
+ this.label4.Text = "Difficulty";
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(22, 164);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(369, 23);
+ this.button1.TabIndex = 6;
+ this.button1.Text = "Go!";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // label5
+ //
+ this.label5.Location = new System.Drawing.Point(120, 136);
+ this.label5.Name = "label5";
+ this.label5.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.label5.Size = new System.Drawing.Size(173, 23);
+ this.label5.TabIndex = 7;
+ this.label5.Text = "0 CP";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(173, 122);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(74, 13);
+ this.label6.TabIndex = 8;
+ this.label6.Text = "You could win";
+ //
+ // cpUpDown
+ //
+ this.cpUpDown.Location = new System.Drawing.Point(22, 138);
+ this.cpUpDown.Maximum = new decimal(new int[] {
+ 1000000,
+ 0,
+ 0,
+ 0});
+ this.cpUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.cpUpDown.Name = "cpUpDown";
+ this.cpUpDown.Size = new System.Drawing.Size(92, 20);
+ this.cpUpDown.TabIndex = 9;
+ this.cpUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // difUpDown
+ //
+ this.difUpDown.Location = new System.Drawing.Point(299, 138);
+ this.difUpDown.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.difUpDown.Minimum = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.difUpDown.Name = "difUpDown";
+ this.difUpDown.Size = new System.Drawing.Size(92, 20);
+ this.difUpDown.TabIndex = 10;
+ this.difUpDown.Value = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(147, 20);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(115, 13);
+ this.label1.TabIndex = 11;
+ this.label1.Text = "Welcome to ShiftLotto!";
+ //
+ // timer1
+ //
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // label7
+ //
+ this.label7.Location = new System.Drawing.Point(22, 190);
+ this.label7.Name = "label7";
+ this.label7.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.label7.Size = new System.Drawing.Size(369, 23);
+ this.label7.TabIndex = 12;
+ this.label7.Text = "Current CP: 0 CP";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // ShiftLotto
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.difUpDown);
+ this.Controls.Add(this.cpUpDown);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Name = "ShiftLotto";
+ this.Size = new System.Drawing.Size(419, 252);
+ ((System.ComponentModel.ISupportInitialize)(this.cpUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.difUpDown)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.NumericUpDown cpUpDown;
+ private System.Windows.Forms.NumericUpDown difUpDown;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Label label7;
+ }
+}
diff --git a/ShiftOS.WinForms/Applications/ShiftLotto.cs b/ShiftOS.WinForms/Applications/ShiftLotto.cs
new file mode 100644
index 0000000..5ab8154
--- /dev/null
+++ b/ShiftOS.WinForms/Applications/ShiftLotto.cs
@@ -0,0 +1,134 @@
+/*
+ * 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;
+
+namespace ShiftOS.WinForms.Applications
+{
+ [Launcher("ShiftLotto", true, "al_shiftlotto", "Games")]
+ [MultiplayerOnly]
+ [DefaultIcon("iconShiftLotto")]
+ [RequiresUpgrade("shiftlotto")]
+ [WinOpen("shiftlotto")]
+ public partial class ShiftLotto : UserControl, IShiftOSWindow
+ {
+ public ShiftLotto()
+ {
+ InitializeComponent();
+ }
+
+ public void OnLoad()
+ {
+ timer1.Start();
+ }
+
+
+ public void OnSkinLoad()
+ {
+
+ }
+
+ public bool OnUnload()
+ {
+ return true;
+ }
+
+ public void OnUpgrade()
+ {
+
+ }
+
+ // The Dynamic Display
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ int codePoints = Convert.ToInt32(Math.Round(cpUpDown.Value, 0));
+ int difficulty = Convert.ToInt32(Math.Round(difUpDown.Value, 0));
+ label5.Text = codePoints * difficulty + " CP";
+ label7.Text = "Current CP: " + SaveSystem.CurrentSave.Codepoints.ToString() + " CP";
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ // Make codePoints and difficulty in this function
+ int codePoints = Convert.ToInt32(Math.Round(cpUpDown.Value, 0));
+ int difficulty = Convert.ToInt32(Math.Round(difUpDown.Value, 0));
+
+ if (SaveSystem.CurrentSave.Codepoints <= 9)
+ {
+ Infobox.Show("Not enough Codepoints", "You do not have enough Codepoints to use ShiftLotto!");
+ }
+ else
+ {
+ if (SaveSystem.CurrentSave.Codepoints - (codePoints * difficulty) <= 0)
+ {
+ Infobox.Show("Not enough Codepoints", "You do not have enough Codepoints to gamble this amount!");
+ }
+ else
+ {
+ // Create Random Ints
+ Random rnd = new Random();
+
+ // Set their highest possible number to Difficulty
+ int guessedNumber = rnd.Next(0, difficulty);
+ int winningNumber = rnd.Next(0, difficulty);
+
+ // Multiply CodePoints * Difficulty
+ int jackpot = codePoints * difficulty;
+
+ // Test the random ints
+ if (guessedNumber == winningNumber)
+ {
+ // If you win
+
+ // Add Codepoints
+ SaveSystem.TransferCodepointsFrom("shiftlotto", jackpot);
+
+ // Infobox
+ Infobox.Show("YOU WON!", "Good Job! " + jackpot.ToString() + " CP has been added to your account. ");
+ }
+ else
+ {
+ // If you fail
+
+ // Remove Codepoints
+ SaveSystem.TransferCodepointsToVoid(jackpot);
+
+
+
+ // Infobox
+ Infobox.Show("YOU FAILED!", "Sorry! " + jackpot.ToString() + " CP has been removed from your account.");
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/ShiftOS.WinForms/Applications/ShiftLotto.resx b/ShiftOS.WinForms/Applications/ShiftLotto.resx
new file mode 100644
index 0000000..4664613
--- /dev/null
+++ b/ShiftOS.WinForms/Applications/ShiftLotto.resx
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="label2.Text" xml:space="preserve">
+ <value>ShiftLotto lets you to turn a few codepoints into a FOURTUNE! All you need to
+do is bet a certain amount of codepoints, set a difficulty, and try your luck.
+ There have been many winners - Will you be one too?</value>
+ </data>
+ <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/ShiftOS.WinForms/Applications/ShiftSweeper.cs b/ShiftOS.WinForms/Applications/ShiftSweeper.cs
index b13880f..cf6d331 100644
--- a/ShiftOS.WinForms/Applications/ShiftSweeper.cs
+++ b/ShiftOS.WinForms/Applications/ShiftSweeper.cs
@@ -36,6 +36,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications {
[Launcher("ShiftSweeper", true, "al_shiftsweeper", "Games")]
[RequiresUpgrade("shiftsweeper")]
+ [MultiplayerOnly]
[WinOpen("shiftsweeper")]
[DefaultIcon("iconShiftSweeper")]
public partial class ShiftSweeper : UserControl, IShiftOSWindow {
diff --git a/ShiftOS.WinForms/Applications/Shifter.cs b/ShiftOS.WinForms/Applications/Shifter.cs
index 9a9b4ad..02e2d0a 100644
--- a/ShiftOS.WinForms/Applications/Shifter.cs
+++ b/ShiftOS.WinForms/Applications/Shifter.cs
@@ -32,7 +32,9 @@ using System.Windows.Forms;
using ShiftOS.Engine;
using ShiftOS.WinForms.Tools;
-namespace ShiftOS.WinForms.Applications {
+namespace ShiftOS.WinForms.Applications
+{
+ [MultiplayerOnly]
[Launcher("Shifter", true, "al_shifter", "Customization")]
[RequiresUpgrade("shifter")]
[WinOpen("shifter")]
@@ -439,6 +441,30 @@ namespace ShiftOS.WinForms.Applications {
flbody.Controls.Add(color);
color.Show();
}
+ else if(c.Field.FieldType.IsEnum == true)
+ {
+ var cBox = new ComboBox();
+ cBox.Width = 150;
+ ControlManager.SetupControl(cBox);
+
+ foreach(var itm in Enum.GetNames(c.Field.FieldType))
+ {
+ cBox.Items.Add(itm);
+ }
+
+ cBox.Text = c.Field.GetValue(LoadedSkin).ToString();
+
+ cBox.SelectedIndexChanged += (o, a) =>
+ {
+ c.Field.SetValue(LoadedSkin, Enum.Parse(c.Field.FieldType, cBox.Text));
+ };
+
+ labelHeight = cBox.Height;
+
+ flbody.Controls.Add(cBox);
+ cBox.Show();
+ flbody.SetFlowBreak(cBox, true);
+ }
else if(c.Field.FieldType == typeof(int))
{
if (c.Field.HasShifterEnumMask())
diff --git a/ShiftOS.WinForms/Applications/Shiftnet.cs b/ShiftOS.WinForms/Applications/Shiftnet.cs
index 9540794..c1c81d5 100644
--- a/ShiftOS.WinForms/Applications/Shiftnet.cs
+++ b/ShiftOS.WinForms/Applications/Shiftnet.cs
@@ -34,9 +34,11 @@ using System.Windows.Forms;
using ShiftOS.Engine;
using Newtonsoft.Json;
using static ShiftOS.Engine.SkinEngine;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications {
[Launcher("Shiftnet", false, null, "Networking")]
+ [MultiplayerOnly]
[DefaultIcon("iconShiftnet")]
public partial class Shiftnet : UserControl, IShiftOSWindow {
public Shiftnet() {
@@ -62,6 +64,8 @@ namespace ShiftOS.WinForms.Applications {
}
public string ConstructHtml(string markdown) {
+ var TerminalForeColor = ControlManager.ConvertColor(SkinEngine.LoadedSkin.TerminalForeColorCC);
+ var TerminalBackColor = ControlManager.ConvertColor(SkinEngine.LoadedSkin.TerminalBackColorCC);
string html = $@"<html>
<head>
<style>
@@ -90,8 +94,8 @@ namespace ShiftOS.WinForms.Applications {
pre, code {{
font-family: ""{LoadedSkin.TerminalFont.Name}"";
font-size: {LoadedSkin.TerminalFont.SizeInPoints}pt;
- color: rgb({LoadedSkin.TerminalForeColor.R}, {LoadedSkin.TerminalForeColor.G}, {LoadedSkin.TerminalForeColor.B});
- background-color: rgb({LoadedSkin.TerminalBackColor.R}, {LoadedSkin.TerminalBackColor.G}, {LoadedSkin.TerminalBackColor.B});
+ color: rgb({TerminalForeColor.R}, {TerminalForeColor.G}, {TerminalForeColor.B});
+ background-color: rgb({TerminalBackColor.R}, {TerminalBackColor.G}, {TerminalBackColor.B});
}}
</style>
</head>
diff --git a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
index b3724ae..0580b47 100644
--- a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
+++ b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
@@ -39,6 +39,7 @@ namespace ShiftOS.WinForms.Applications
{
[Launcher("Shiftorium", true, "al_shiftorium", "Utilities")]
[RequiresUpgrade("shiftorium_gui")]
+ [MultiplayerOnly]
[WinOpen("shiftorium")]
[DefaultTitle("Shiftorium")]
[DefaultIcon("iconShiftorium")]
diff --git a/ShiftOS.WinForms/Applications/Terminal.cs b/ShiftOS.WinForms/Applications/Terminal.cs
index 9bd9f3c..c0fdf01 100644
--- a/ShiftOS.WinForms/Applications/Terminal.cs
+++ b/ShiftOS.WinForms/Applications/Terminal.cs
@@ -43,6 +43,7 @@ using System.Collections;
using static ShiftOS.Engine.SkinEngine;
using ShiftOS.Engine;
using ShiftOS.Objects;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications {
[Launcher("Terminal", false, null, "Utilities")]
@@ -115,8 +116,9 @@ namespace ShiftOS.WinForms.Applications {
rtbterm.Text = "";
TerminalBackend.PrefixEnabled = true;
TerminalBackend.InStory = false;
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
- if (Shiftorium.UpgradeInstalled("wm_free_placement")) {
+ TerminalBackend.PrintPrompt();
+ if (Shiftorium.UpgradeInstalled("wm_free_placement"))
+ {
this.ParentForm.Width = 640;
this.ParentForm.Height = 480;
this.ParentForm.Left = (Screen.PrimaryScreen.Bounds.Width - 640) / 2;
@@ -235,8 +237,9 @@ namespace ShiftOS.WinForms.Applications {
}
}
}
- if (TerminalBackend.PrefixEnabled) {
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
+ if (TerminalBackend.PrefixEnabled)
+ {
+ TerminalBackend.PrintPrompt();
}
}
} catch {
@@ -289,8 +292,8 @@ namespace ShiftOS.WinForms.Applications {
txt.Focus();
txt.Font = LoadedSkin.TerminalFont;
- txt.ForeColor = LoadedSkin.TerminalForeColor;
- txt.BackColor = LoadedSkin.TerminalBackColor;
+ txt.ForeColor = ControlManager.ConvertColor(LoadedSkin.TerminalForeColorCC);
+ txt.BackColor = ControlManager.ConvertColor(LoadedSkin.TerminalBackColorCC);
}
@@ -321,8 +324,7 @@ namespace ShiftOS.WinForms.Applications {
rtbterm.Text = AppearanceManager.LastTerminalText;
rtbterm.Select(rtbterm.TextLength, 0);
}
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
-
+ TerminalBackend.PrintPrompt();
}
@@ -331,9 +333,11 @@ namespace ShiftOS.WinForms.Applications {
public void OnSkinLoad() {
try {
rtbterm.Font = LoadedSkin.TerminalFont;
- rtbterm.ForeColor = LoadedSkin.TerminalForeColor;
- rtbterm.BackColor = LoadedSkin.TerminalBackColor;
- } catch {
+ rtbterm.ForeColor = ControlManager.ConvertColor(LoadedSkin.TerminalForeColorCC);
+ rtbterm.BackColor = ControlManager.ConvertColor(LoadedSkin.TerminalBackColorCC);
+ }
+ catch
+ {
}
@@ -369,5 +373,4 @@ namespace ShiftOS.WinForms.Applications {
}
}
-}
-//lol you found this comment i made so i chould push a change to make a point. \ No newline at end of file
+} \ No newline at end of file
diff --git a/ShiftOS.WinForms/Applications/TutorialBox.cs b/ShiftOS.WinForms/Applications/TutorialBox.cs
index 25921e1..3c74443 100644
--- a/ShiftOS.WinForms/Applications/TutorialBox.cs
+++ b/ShiftOS.WinForms/Applications/TutorialBox.cs
@@ -21,6 +21,8 @@ namespace ShiftOS.WinForms.Applications
InitializeComponent();
IsComplete = false;
lbltuttext.Text = "";
+ lbltuttext.Padding = new Padding(15);
+ lbltuttext.Margin = lbltuttext.Padding;
}
bool stillTyping = false;
@@ -47,6 +49,7 @@ namespace ShiftOS.WinForms.Applications
}));
Thread.Sleep(75);
}
+ Thread.Sleep(5000);
stillTyping = false;
}).Start();
}
diff --git a/ShiftOS.WinForms/Controls/TerminalBox.cs b/ShiftOS.WinForms/Controls/TerminalBox.cs
index 4fcb429..9e4c61c 100644
--- a/ShiftOS.WinForms/Controls/TerminalBox.cs
+++ b/ShiftOS.WinForms/Controls/TerminalBox.cs
@@ -24,11 +24,14 @@
using System;
using System.Collections.Generic;
+using System.Drawing;
using System.Linq;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Controls
{
@@ -53,13 +56,60 @@ namespace ShiftOS.WinForms.Controls
public void Write(string text)
{
this.HideSelection = true;
+ this.Select(this.TextLength, 0);
+ this.SelectionFont = ConstructFont();
+ this.SelectionColor = ControlManager.ConvertColor(ConsoleEx.ForegroundColor);
+ this.SelectionBackColor = ControlManager.ConvertColor(ConsoleEx.BackgroundColor);
this.AppendText(Localization.Parse(text));
this.HideSelection = false;
}
+ private Font ConstructFont()
+ {
+ FontStyle fs = FontStyle.Regular;
+ if (ConsoleEx.Bold)
+ fs = fs | FontStyle.Bold;
+ if (ConsoleEx.Italic)
+ fs = fs | FontStyle.Italic;
+ if (ConsoleEx.Underline)
+ fs = fs | FontStyle.Underline;
+
+ return new Font(this.Font, fs);
+ }
+
public void WriteLine(string text)
{
+ this.HideSelection = true;
+ this.Select(this.TextLength, 0);
+ this.SelectionFont = ConstructFont();
+ this.SelectionColor = ControlManager.ConvertColor(ConsoleEx.ForegroundColor);
+ this.SelectionBackColor = ControlManager.ConvertColor(ConsoleEx.BackgroundColor);
this.AppendText(Localization.Parse(text) + Environment.NewLine);
+ this.HideSelection = false;
+ }
+
+ bool quickCopying = false;
+
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ //if right-clicking, then we initiate a quick-copy.
+ if (e.Button == MouseButtons.Right)
+ quickCopying = true;
+
+ //Override the mouse event so that it's a left-click at all times.
+ base.OnMouseDown(new MouseEventArgs(MouseButtons.Left, e.Clicks, e.X, e.Y, e.Delta));
+ }
+
+ protected override void OnMouseUp(MouseEventArgs mevent)
+ {
+ if(quickCopying == true)
+ {
+ if (!string.IsNullOrWhiteSpace(this.SelectedText))
+ {
+ this.Copy();
+ }
+ }
+ base.OnMouseUp(mevent);
}
}
}
diff --git a/ShiftOS.WinForms/HackerCommands.cs b/ShiftOS.WinForms/HackerCommands.cs
index 7861981..107343b 100644
--- a/ShiftOS.WinForms/HackerCommands.cs
+++ b/ShiftOS.WinForms/HackerCommands.cs
@@ -59,10 +59,25 @@ namespace ShiftOS.WinForms
{
private static void writeSlow(string text)
{
- Console.Write("[hacker101@undisclosed]: ");
- Thread.Sleep(200);
+ 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(1000);
+ Thread.Sleep(4000);
}
[Story("hacker101_deadaccts")]
@@ -121,9 +136,12 @@ namespace ShiftOS.WinForms
TerminalBackend.PrefixEnabled = true;
Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
StartHackerTutorial();
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
});
t.IsBackground = true;
t.Start();
+ TerminalBackend.PrefixEnabled = false;
}
internal static void StartHackerTutorial()
@@ -140,8 +158,7 @@ namespace ShiftOS.WinForms
int tutPos = 0;
Action ondec = () =>
{
- if (tutPos == 2)
- tutPos++;
+ tutPos++;
};
TerminalBackend.CommandProcessed += (o, a) =>
{
@@ -351,6 +368,7 @@ namespace ShiftOS.WinForms
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_";
+ [MultiplayerOnly]
[Command("breach_user_password")]
[KernelMode]
[RequiresArgument("user")]
@@ -360,7 +378,7 @@ namespace ShiftOS.WinForms
{
string usr = args["user"].ToString();
string sys = args["sys"].ToString();
-
+ bool received = false;
ServerMessageReceived msgReceived = null;
Console.WriteLine("--hooking system thread...");
@@ -373,30 +391,34 @@ namespace ShiftOS.WinForms
var rnd = new Random();
var sw = new Stopwatch();
sw.Start();
- string pass = "";
- for(int i = 0; i < sve.Password.Length; i++)
+ Thread.Sleep(2000);
+ if(rnd.Next(0, 100) >= 75)
{
- char c = '\0';
- while (c != sve.Password[i])
- c = chars[rnd.Next(0, chars.Length)];
- pass += c;
- Thread.Sleep(rnd.Next(25,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(pass);
+ Console.WriteLine(sve.Password);
Console.WriteLine();
Console.WriteLine("--password breached. Operation took " + sw.ElapsedMilliseconds + " milliseconds.");
+ received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
+ received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
+ TerminalBackend.PrefixEnabled = true;
};
Console.WriteLine("--beginning brute-force attack on " + usr + "@" + sys + "...");
- Thread.Sleep(500);
ServerManager.MessageReceived += msgReceived;
ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new
@@ -404,9 +426,13 @@ namespace ShiftOS.WinForms
user = usr,
sysname = sys
}));
+ TerminalBackend.PrefixEnabled = false;
+ Thread.Sleep(500);
return true;
}
+
+ [MultiplayerOnly]
[Command("print_user_info")]
[KernelMode]
[RequiresArgument("pass")]
@@ -418,7 +444,7 @@ namespace ShiftOS.WinForms
string usr = args["user"].ToString();
string sys = args["sys"].ToString();
string pass = args["pass"].ToString();
-
+ bool received = false;
ServerMessageReceived msgReceived = null;
Console.WriteLine("--hooking multi-user domain response call...");
@@ -441,18 +467,22 @@ namespace ShiftOS.WinForms
{
Console.WriteLine("--access denied.");
}
+ received = true;
ServerManager.MessageReceived -= msgReceived;
-
+ TerminalBackend.PrintPrompt();
+
}
else if (msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
+ received = true;
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
@@ -460,9 +490,12 @@ namespace ShiftOS.WinForms
user = usr,
sysname = sys
}));
+ Thread.Sleep(500);
+ TerminalBackend.PrefixEnabled = false;
return true;
}
+ [MultiplayerOnly]
[Command("steal_codepoints")]
[KernelMode]
[RequiresArgument("amount")]
@@ -476,7 +509,7 @@ namespace ShiftOS.WinForms
string sys = args["sys"].ToString();
string pass = args["pass"].ToString();
long amount = (long)args["amount"];
-
+ bool received = false;
if(amount < 0)
{
Console.WriteLine("--invalid codepoint amount - halting...");
@@ -497,6 +530,8 @@ namespace ShiftOS.WinForms
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;
}
@@ -509,14 +544,18 @@ namespace ShiftOS.WinForms
{
Console.WriteLine("--access denied.");
}
-
+ received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
else if (msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
+ received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
+ TerminalBackend.PrefixEnabled = true;
};
Console.WriteLine("--contacting multi-user domain...");
@@ -528,9 +567,65 @@ namespace ShiftOS.WinForms
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<string, object> 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<Save>(msg.Contents);
+ if (sve.Password == pass)
+ {
+ ServerManager.SendMessage("delete_dead_save", JsonConvert.SerializeObject(sve));
+ Console.WriteLine("<mud> 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)]
@@ -573,6 +668,7 @@ namespace ShiftOS.WinForms
}
}
+ [MultiplayerOnly]
[Namespace("storydev")]
public static class StoryDevCommands
{
@@ -604,5 +700,15 @@ namespace ShiftOS.WinForms
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<string, object> args)
+ {
+ SaveSystem.CurrentSave.StoriesExperienced.Add(args["id"].ToString());
+ SaveSystem.SaveGame();
+ return true;
+ }
}
}
diff --git a/ShiftOS.WinForms/Properties/Resources.Designer.cs b/ShiftOS.WinForms/Properties/Resources.Designer.cs
index 2df6f11..6628f0b 100644
--- a/ShiftOS.WinForms/Properties/Resources.Designer.cs
+++ b/ShiftOS.WinForms/Properties/Resources.Designer.cs
@@ -732,6 +732,16 @@ namespace ShiftOS.WinForms.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap iconShiftLotto {
+ get {
+ object obj = ResourceManager.GetObject("iconShiftLotto", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap iconShiftnet {
get {
object obj = ResourceManager.GetObject("iconShiftnet", resourceCulture);
@@ -923,15 +933,11 @@ namespace ShiftOS.WinForms.Properties {
/// Company: &quot;ShiftSoft&quot;
/// },
/// {
- /// Company: &quot;&quot;
- /// },
- /// {
- ///
- /// },
- /// {
- ///
- /// },
- ///].
+ /// Company: &quot;Shiftcast&quot;,
+ /// Name: &quot;NetXtreme Hyper Edition&quot;,
+ /// CostPerMonth: 1500,
+ /// DownloadSpeed: 524288, //512 kb/s
+ /// Description: &quot;It&apos;s time to supercharge your Shif [rest of string was truncated]&quot;;.
/// </summary>
internal static string ShiftnetServices {
get {
diff --git a/ShiftOS.WinForms/Properties/Resources.resx b/ShiftOS.WinForms/Properties/Resources.resx
index 5100329..bef4f99 100644
--- a/ShiftOS.WinForms/Properties/Resources.resx
+++ b/ShiftOS.WinForms/Properties/Resources.resx
@@ -475,4 +475,7 @@
<data name="ShiftnetServices" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ShiftnetServices.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
+ <data name="iconShiftLotto" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\systemicons\iconshiftlotto.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
</root> \ No newline at end of file
diff --git a/ShiftOS.WinForms/Resources/Shiftorium.txt b/ShiftOS.WinForms/Resources/Shiftorium.txt
index 8e09d6e..12e3a1a 100644
--- a/ShiftOS.WinForms/Resources/Shiftorium.txt
+++ b/ShiftOS.WinForms/Resources/Shiftorium.txt
@@ -125,6 +125,20 @@
Description: "Want to adjust the volume of ShiftOS's audio? This upgrade will let you."
},
+ //SHIFTLOTTO UPGRADES
+ {
+ Name: "ShiftLotto",
+ Cost: 200,
+ Dependencies: null,
+ Description: "Are you feeling lucky? Spend some money on this upgrade! If you have any left, go ahead and bet your money in ShiftLotto!"
+ },
+ {
+ Name: "AL ShiftLotto",
+ Cost: 150,
+ Dependencies: "app_launcher;shiftlotto",
+ Description: "This upgrade allows you to find ShiftLotto in your App Launcher."
+ },
+
// COLOR DEPTH AND DITHERING
{
diff --git a/ShiftOS.WinForms/ShiftOS.WinForms.csproj b/ShiftOS.WinForms/ShiftOS.WinForms.csproj
index 6491a02..62df12a 100644
--- a/ShiftOS.WinForms/ShiftOS.WinForms.csproj
+++ b/ShiftOS.WinForms/ShiftOS.WinForms.csproj
@@ -166,6 +166,12 @@
<Compile Include="Applications\Shifter.Designer.cs">
<DependentUpon>Shifter.cs</DependentUpon>
</Compile>
+ <Compile Include="Applications\ShiftLotto.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Applications\ShiftLotto.Designer.cs">
+ <DependentUpon>ShiftLotto.cs</DependentUpon>
+ </Compile>
<Compile Include="Applications\Shiftnet.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -341,6 +347,9 @@
<EmbeddedResource Include="Applications\Shifter.resx">
<DependentUpon>Shifter.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Applications\ShiftLotto.resx">
+ <DependentUpon>ShiftLotto.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="Applications\Shiftnet.resx">
<DependentUpon>Shiftnet.cs</DependentUpon>
</EmbeddedResource>
@@ -609,6 +618,7 @@
<Content Include="SystemIcons\iconPong.png" />
<Content Include="SystemIcons\iconShifter.png" />
<None Include="SystemIcons\iconShiftLetters.png" />
+ <Content Include="SystemIcons\iconShiftLotto.png" />
<Content Include="SystemIcons\iconShiftnet.png" />
<Content Include="SystemIcons\iconShiftorium.png" />
<None Include="SystemIcons\iconShiftSweeper.png" />
diff --git a/ShiftOS.WinForms/SystemIcons/iconShiftLotto.png b/ShiftOS.WinForms/SystemIcons/iconShiftLotto.png
new file mode 100644
index 0000000..b2a3ad5
--- /dev/null
+++ b/ShiftOS.WinForms/SystemIcons/iconShiftLotto.png
Binary files differ
diff --git a/ShiftOS.WinForms/Tools/ControlManager.cs b/ShiftOS.WinForms/Tools/ControlManager.cs
index 5cc4813..52663d7 100644
--- a/ShiftOS.WinForms/Tools/ControlManager.cs
+++ b/ShiftOS.WinForms/Tools/ControlManager.cs
@@ -152,6 +152,48 @@ namespace ShiftOS.WinForms.Tools
}
}
+ internal static Color ConvertColor(ConsoleColor cCol)
+ {
+ switch (cCol)
+ {
+ case ConsoleColor.Black:
+ return Color.Black;
+ case ConsoleColor.Gray:
+ return Color.Gray;
+ case ConsoleColor.DarkGray:
+ return Color.DarkGray;
+ case ConsoleColor.Blue:
+ return Color.Blue;
+ case ConsoleColor.Cyan:
+ return Color.Cyan;
+ case ConsoleColor.DarkBlue:
+ return Color.DarkBlue;
+ case ConsoleColor.DarkCyan:
+ return Color.DarkCyan;
+ case ConsoleColor.DarkGreen:
+ return Color.DarkGreen;
+ case ConsoleColor.DarkMagenta:
+ return Color.DarkMagenta;
+ case ConsoleColor.DarkRed:
+ return Color.DarkRed;
+ case ConsoleColor.DarkYellow:
+ return Color.YellowGreen;
+ case ConsoleColor.Yellow:
+ return Color.Yellow;
+ case ConsoleColor.Green:
+ return Color.Green;
+ case ConsoleColor.Magenta:
+ return Color.Magenta;
+ case ConsoleColor.Red:
+ return Color.Red;
+ case ConsoleColor.White:
+ return Color.White;
+ default:
+ return Color.Black;
+ }
+
+ }
+
public static void SetCursor(Control ctrl)
{
#if STUPID
diff --git a/ShiftOS.WinForms/WinformsDesktop.cs b/ShiftOS.WinForms/WinformsDesktop.cs
index 8900a69..d30adb4 100644
--- a/ShiftOS.WinForms/WinformsDesktop.cs
+++ b/ShiftOS.WinForms/WinformsDesktop.cs
@@ -63,8 +63,10 @@ namespace ShiftOS.WinForms
NotificationDaemon.NotificationMade += (note) =>
{
//Soon this will pop a balloon note.
- btnnotifications.Text = "Notifications (" + NotificationDaemon.GetUnreadCount().ToString() + ")";
-
+ this.Invoke(new Action(() =>
+ {
+ btnnotifications.Text = "Notifications (" + NotificationDaemon.GetUnreadCount().ToString() + ")";
+ }));
};
NotificationDaemon.NotificationRead += () =>
diff --git a/ShiftOS.WinForms/WinformsWindowManager.cs b/ShiftOS.WinForms/WinformsWindowManager.cs
index b8f0cae..eeaa6c9 100644
--- a/ShiftOS.WinForms/WinformsWindowManager.cs
+++ b/ShiftOS.WinForms/WinformsWindowManager.cs
@@ -106,6 +106,24 @@ namespace ShiftOS.WinForms
return;
}
+ foreach(var attr in form.GetType().GetCustomAttributes(true))
+ {
+ if(attr is MultiplayerOnlyAttribute)
+ {
+ if(KernelWatchdog.MudConnected == false)
+ {
+ Infobox.PromptYesNo("Disconnected from MUD", "This application requires a connection to the MUD. Would you like to reconnect?", new Action<bool>((answer) =>
+ {
+ if(answer == true)
+ {
+ KernelWatchdog.MudConnected = true;
+ SetupWindow(form);
+ }
+ }));
+ return;
+ }
+ }
+ }
if (!Shiftorium.UpgradeAttributesUnlocked(form.GetType()))
{
diff --git a/ShiftOS_TheReturn.sln b/ShiftOS_TheReturn.sln
index 7f7acdf..a3eb2a0 100644
--- a/ShiftOS_TheReturn.sln
+++ b/ShiftOS_TheReturn.sln
@@ -21,6 +21,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModLauncher", "ModLauncher\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShiftOS.Server.WebAdmin", "ShiftOS.Server.WebAdmin\ShiftOS.Server.WebAdmin.csproj", "{B29FDD06-E6FE-40A2-8258-283728CED81A}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gwen", "Gwen\Gwen.csproj", "{ADDA2F43-96C0-497F-8216-29C67ABC9806}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gwen.Renderer.OpenTK", "Gwen.Renderer.OpenTK\Gwen.Renderer.OpenTK.csproj", "{41650C82-D630-4E5C-845A-F1513C8FDC99}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -63,6 +67,14 @@ Global
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ShiftOS_TheReturn/AppLauncherDaemon.cs b/ShiftOS_TheReturn/AppLauncherDaemon.cs
index 7ef34c1..5e3bd72 100644
--- a/ShiftOS_TheReturn/AppLauncherDaemon.cs
+++ b/ShiftOS_TheReturn/AppLauncherDaemon.cs
@@ -66,12 +66,24 @@ namespace ShiftOS.Engine
{
foreach (var attr in type.GetCustomAttributes(false))
{
- if (attr is LauncherAttribute)
+ bool isAllowed = true;
+ if(attr is MultiplayerOnlyAttribute)
{
- var launch = attr as LauncherAttribute;
- if (launch.UpgradeInstalled)
+ if(KernelWatchdog.MudConnected == false)
{
- win.Add(new LauncherItem { DisplayData = launch, LaunchType = type });
+ isAllowed = false;
+
+ }
+ }
+ if (isAllowed == true)
+ {
+ if (attr is LauncherAttribute)
+ {
+ var launch = attr as LauncherAttribute;
+ if (launch.UpgradeInstalled)
+ {
+ win.Add(new LauncherItem { DisplayData = launch, LaunchType = type });
+ }
}
}
}
diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs
index 779c616..73a7e2d 100644
--- a/ShiftOS_TheReturn/Commands.cs
+++ b/ShiftOS_TheReturn/Commands.cs
@@ -133,6 +133,7 @@ namespace ShiftOS.Engine
[Namespace("mud")]
public static class MUDCommands
{
+ [MultiplayerOnly]
[Command("status")]
public static bool Status()
{
@@ -155,6 +156,8 @@ namespace ShiftOS.Engine
{
Console.WriteLine("{ERROR}: " + ex.Message);
}
+
+ TerminalBackend.PrefixEnabled = false;
return true;
}
catch (Exception ex)
@@ -174,6 +177,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("disconnect")]
[RequiresUpgrade("hacker101_deadaccts")]
public static bool Disconnect()
@@ -183,6 +187,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("sendmsg")]
[KernelMode]
[RequiresUpgrade("hacker101_deadaccts")]
@@ -195,48 +200,6 @@ namespace ShiftOS.Engine
}
}
- [RequiresUpgrade("mud_fundamentals")]
- [Namespace("chat")]
- public static class ChatCommands
- {
- [RequiresArgument("id")]
- [RequiresArgument("name")]
- [RequiresArgument("topic")]
- [Command("create")]
- public static bool CreateChat(Dictionary<string, object> args)
- {
- string id = "";
- string topic = "";
- string name = "";
- int max_users = 0;
-
- id = args["id"] as string;
- name = args["topic"] as string;
- topic = args["name"] as string;
-
- bool valid = true;
-
- if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(topic))
- valid = false;
-
- if (valid)
- {
- ServerManager.SendMessage("chat_create", $@"{{
- id: ""{id}"",
- name: ""{name}"",
- topic: ""{topic}"",
- max_users: {max_users}
-}}");
- }
- else
- {
- Console.WriteLine("{CHAT_PLEASE_PROVIDE_VALID_CHANNEL_DATA}");
- }
- return true;
- }
-
- }
-
[TutorialLock]
[Namespace("trm")]
public static class TerminalCommands
@@ -266,6 +229,7 @@ namespace ShiftOS.Engine
}
}
+ [MultiplayerOnly]
[Namespace("dev")]
public static class ShiftOSDevCommands
{
@@ -475,6 +439,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("save")]
public static bool Save()
{
@@ -482,6 +447,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("status")]
public static bool Status()
{
@@ -494,7 +460,7 @@ Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed,
}
}
-
+ [MultiplayerOnly]
[Namespace("shiftorium")]
public static class ShiftoriumCommands
{
diff --git a/ShiftOS_TheReturn/ConsoleEx.cs b/ShiftOS_TheReturn/ConsoleEx.cs
new file mode 100644
index 0000000..69f6a18
--- /dev/null
+++ b/ShiftOS_TheReturn/ConsoleEx.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShiftOS.Engine
+{
+ public static class ConsoleEx
+ {
+ static ConsoleEx()
+ {
+ ForegroundColor = ConsoleColor.White;
+ BackgroundColor = ConsoleColor.Black;
+
+ Bold = false;
+ Italic = false;
+ Underline = false;
+ }
+
+ public static ConsoleColor ForegroundColor { get; set; }
+ public static ConsoleColor BackgroundColor { get; set; }
+
+ public static bool Bold { get; set; }
+ public static bool Italic { get; set; }
+ public static bool Underline { get; set; }
+ }
+}
diff --git a/ShiftOS_TheReturn/Infobox.cs b/ShiftOS_TheReturn/Infobox.cs
index 3e8fa30..e3308dc 100644
--- a/ShiftOS_TheReturn/Infobox.cs
+++ b/ShiftOS_TheReturn/Infobox.cs
@@ -55,11 +55,11 @@ namespace ShiftOS.Engine
/// </summary>
/// <param name="title">Infobox title</param>
/// <param name="message">Infobox message</param>
- public static void Show(string title, string message)
+ public static void Show(string title, string message, Action callback = null)
{
title = Localization.Parse(title);
message = Localization.Parse(message);
- _infobox.Open(title, message);
+ _infobox.Open(title, message, callback);
}
public static void PromptText(string title, string message, Action<string> callback)
@@ -89,7 +89,7 @@ namespace ShiftOS.Engine
// Infobox Interface
public interface IInfobox
{
- void Open(string title, string msg);
+ void Open(string title, string msg, Action callback = null);
void PromptText(string title, string message, Action<string> callback);
void PromptYesNo(string title, string message, Action<bool> callback);
}
diff --git a/ShiftOS_TheReturn/KernelWatchdog.cs b/ShiftOS_TheReturn/KernelWatchdog.cs
index 1b59b25..cc03f5a 100644
--- a/ShiftOS_TheReturn/KernelWatchdog.cs
+++ b/ShiftOS_TheReturn/KernelWatchdog.cs
@@ -25,8 +25,44 @@ namespace ShiftOS.Engine
}
}
+ private static bool _mudConnected = true;
+
public static bool InKernelMode { get; private set; }
- public static bool MudConnected { get; set; }
+ public static bool MudConnected
+ {
+ get
+ {
+ return _mudConnected;
+ }
+ set
+ {
+ if(value == false)
+ {
+ foreach(var win in AppearanceManager.OpenForms)
+ {
+ foreach(var attr in win.ParentWindow.GetType().GetCustomAttributes(true))
+ {
+ if(attr is MultiplayerOnlyAttribute)
+ {
+ ConsoleEx.Bold = true;
+ ConsoleEx.Underline = false;
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.Red;
+ Console.Write("Error:");
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine("Cannot disconnect from multi-user domain because an app that depends on it is open.");
+ TerminalBackend.PrintPrompt();
+ return;
+ }
+ }
+ }
+ }
+
+ _mudConnected = value;
+ Desktop.PopulateAppLauncher();
+ }
+ }
public static bool IsSafe(Type type)
{
@@ -66,5 +102,31 @@ namespace ShiftOS.Engine
InKernelMode = false;
Console.WriteLine("<kernel> Kernel mode disabled.");
}
+
+ internal static bool CanRunOffline(Type method)
+ {
+ if (MudConnected)
+ return true;
+
+ foreach (var attr in method.GetCustomAttributes(false))
+ {
+ if (attr is MultiplayerOnlyAttribute)
+ return false;
+ }
+ return true;
+ }
+
+ internal static bool CanRunOffline(MethodInfo method)
+ {
+ if (MudConnected)
+ return true;
+
+ foreach(var attr in method.GetCustomAttributes(false))
+ {
+ if (attr is MultiplayerOnlyAttribute)
+ return false;
+ }
+ return true;
+ }
}
}
diff --git a/ShiftOS_TheReturn/Scripting.cs b/ShiftOS_TheReturn/Scripting.cs
index 3ecf9d9..d96bc98 100644
--- a/ShiftOS_TheReturn/Scripting.cs
+++ b/ShiftOS_TheReturn/Scripting.cs
@@ -63,6 +63,26 @@ namespace ShiftOS.Engine.Scripting
public dynamic Lua = new DynamicLua.DynamicLua();
public bool Running = true;
+ static LuaInterpreter()
+ {
+ ServerManager.MessageReceived += (msg) =>
+ {
+ if (msg.Name == "run")
+ {
+ TerminalBackend.PrefixEnabled = false;
+ var cntnts = JsonConvert.DeserializeObject<dynamic>(msg.Contents);
+ var interp = new LuaInterpreter();
+ Desktop.InvokeOnWorkerThread(() =>
+ {
+ interp.Execute(cntnts.script.ToString());
+
+ });
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
+ }
+ };
+ }
+
public static string CreateSft(string lua)
{
byte[] bytes = Encoding.UTF8.GetBytes(lua);
@@ -341,12 +361,41 @@ end");
}
}
+ [Exposed("mud")]
+ public class MUDFunctions
+ {
+ public void sendDiagnostic(string src, string cat, object val)
+ {
+ ServerManager.SendMessage("diag_log", $"[{src}] <{cat}>: {val}");
+ }
+ }
+
+ [Exposed("userinfo")]
+ public class UserInfoFunctions
+ {
+ public string getUsername()
+ {
+ return SaveSystem.CurrentSave.Username;
+ }
+
+ public string getSysname()
+ {
+ return SaveSystem.CurrentSave.SystemName;
+ }
+
+ public string getEmail()
+ {
+ return getUsername() + "@" + getSysname();
+ }
+ }
+
+
[Exposed("infobox")]
public class InfoboxFunctions
{
- public void show(string title, string message)
+ public void show(string title, string message, Action callback = null)
{
- Infobox.Show(title, message);
+ Infobox.Show(title, message, callback);
}
public void question(string title, string message, Action<bool> callback)
diff --git a/ShiftOS_TheReturn/ServerManager.cs b/ShiftOS_TheReturn/ServerManager.cs
index a121ab6..31b3129 100644
--- a/ShiftOS_TheReturn/ServerManager.cs
+++ b/ShiftOS_TheReturn/ServerManager.cs
@@ -125,6 +125,8 @@ namespace ShiftOS.Engine
{
thisGuid = new Guid(msg.Contents);
GUIDReceived?.Invoke(msg.Contents);
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "allusers")
{
@@ -132,6 +134,7 @@ namespace ShiftOS.Engine
{
Console.WriteLine(acc);
}
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "update_your_cp")
{
@@ -154,9 +157,15 @@ namespace ShiftOS.Engine
{
var ex = JsonConvert.DeserializeObject<Exception>(msg.Contents);
TerminalBackend.PrefixEnabled = true;
- Console.WriteLine($@"{{MUD_ERROR}}: {ex.Message}");
+ ConsoleEx.ForegroundColor = ConsoleColor.Red;
+ ConsoleEx.Bold = true;
+ Console.Write($@"{{MUD_ERROR}}: ");
+ ConsoleEx.Bold = false;
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(ex.Message);
TerminalBackend.PrefixEnabled = true;
- Console.Write($"{SaveSystem.CurrentSave.Username}@{CurrentSave.SystemName}:~$ ");
+ TerminalBackend.PrintPrompt();
}
else
{
diff --git a/ShiftOS_TheReturn/ShiftOS.Engine.csproj b/ShiftOS_TheReturn/ShiftOS.Engine.csproj
index 5521f49..b6ff903 100644
--- a/ShiftOS_TheReturn/ShiftOS.Engine.csproj
+++ b/ShiftOS_TheReturn/ShiftOS.Engine.csproj
@@ -100,6 +100,7 @@
<Compile Include="CommandParser.cs" />
<Compile Include="Commands.cs" />
<Compile Include="Command.cs" />
+ <Compile Include="ConsoleEx.cs" />
<Compile Include="CrashHandler.cs" />
<Compile Include="CrashHandler.Designer.cs">
<DependentUpon>CrashHandler.cs</DependentUpon>
diff --git a/ShiftOS_TheReturn/Skinning.cs b/ShiftOS_TheReturn/Skinning.cs
index 43e0b5d..800b107 100644
--- a/ShiftOS_TheReturn/Skinning.cs
+++ b/ShiftOS_TheReturn/Skinning.cs
@@ -865,12 +865,12 @@ namespace ShiftOS.Engine {
[ShifterMeta("System")]
[ShifterCategory("General")]
[ShifterName("Terminal text color")]
- public Color TerminalForeColor = DefaultForeground;
+ public ConsoleColor TerminalForeColorCC = ConsoleColor.White;
[ShifterMeta("System")]
[ShifterCategory("General")]
[ShifterName("Terminal background color")]
- public Color TerminalBackColor = DesktopBG;
+ public ConsoleColor TerminalBackColorCC = ConsoleColor.Black;
[ShifterMeta("Desktop")]
[ShifterCategory("Desktop Panel")]
diff --git a/ShiftOS_TheReturn/TerminalBackend.cs b/ShiftOS_TheReturn/TerminalBackend.cs
index fd2524f..318c818 100644
--- a/ShiftOS_TheReturn/TerminalBackend.cs
+++ b/ShiftOS_TheReturn/TerminalBackend.cs
@@ -149,97 +149,170 @@ namespace ShiftOS.Engine {
return RunClient(ns + "." + cmd, args, isRemote);
}
- public static bool RunClient(string text, Dictionary<string, string> args, bool isRemote = false) {
+
+ public static bool RunClient(string text, Dictionary<string, string> argss, bool isRemote = false) {
+ Dictionary<string, object> args = new Dictionary<string, object>();
+ foreach (KeyValuePair<string, string> arg in argss) {
+ args[arg.Key] = arg.Value;
+ }
+ return RunClient(text, args, isRemote);
+ }
+
+ public static bool RunClient(string text, Dictionary<string, object> args, bool isRemote = false) {
latestCommmand = text;
+ //Console.WriteLine(text + " " + "{" + string.Join(",", args.Select(kv => kv.Key + "=" + kv.Value).ToArray()) + "}" + " " + isRemote);
+
foreach (var asmExec in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) {
try {
var asm = Assembly.LoadFile(asmExec);
var types = asm.GetTypes();
-
- foreach (var type in types) {
- if (Shiftorium.UpgradeAttributesUnlocked(type)) {
- if (KernelWatchdog.IsSafe(type)) {
- foreach (var a in type.GetCustomAttributes(false)) {
- if (a is Namespace) {
- var ns = a as Namespace;
- if (text.Split('.')[0] == ns.name) {
- foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) {
- if (Shiftorium.UpgradeAttributesUnlocked(method)) {
- if (KernelWatchdog.IsSafe(method)) {
- if (CanRunRemotely(method, isRemote)) {
- foreach (var ma in method.GetCustomAttributes(false)) {
- if (ma is Command) {
+ foreach (var type in types)
+ {
+ if (Shiftorium.UpgradeAttributesUnlocked(type))
+ {
+ foreach (var a in type.GetCustomAttributes(false))
+ {
+ if (a is Namespace)
+ {
+ var ns = a as Namespace;
+ if (text.Split('.')[0] == ns.name)
+ {
+ if (KernelWatchdog.IsSafe(type))
+ {
+ if (KernelWatchdog.CanRunOffline(type))
+ {
+ foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static))
+ {
+ if (Shiftorium.UpgradeAttributesUnlocked(method))
+ {
+ if (CanRunRemotely(method, isRemote))
+ {
+ foreach (var ma in method.GetCustomAttributes(false))
+ {
+ if (ma is Command)
+ {
var cmd = ma as Command;
- if (text.Split('.')[1] == cmd.name) {
-
- var attr = method.GetCustomAttribute<CommandObsolete>();
-
- if (attr != null) {
- string newcommand = attr.newcommand;
- if (attr.warn) {
- Console.WriteLine(Localization.Parse((newcommand == "" ? "{ERROR}" : "{WARN}") + attr.reason, new Dictionary<string, string>() {
+ if (text.Split('.')[1] == cmd.name)
+ {
+ if (KernelWatchdog.IsSafe(method))
+ {
+ if (KernelWatchdog.CanRunOffline(method))
+ {
+ var attr = method.GetCustomAttribute<CommandObsolete>();
+
+ if (attr != null)
+ {
+ string newcommand = attr.newcommand;
+ if (attr.warn)
+ {
+ Console.WriteLine(Localization.Parse((newcommand == "" ? "{ERROR}" : "{WARN}") + attr.reason, new Dictionary<string, string>() {
{"%newcommand", newcommand}
}));
- }
- if (newcommand != "") {
- // redo the entire process running newcommand
-
- return RunClient(newcommand, args);
- }
- }
+ }
+ if (newcommand != "")
+ {
+ // redo the entire process running newcommand
- var requiresArgs = method.GetCustomAttributes<RequiresArgument>();
-
- bool error = false;
- bool providedusage = false;
-
- foreach (RequiresArgument argument in requiresArgs) {
- if (!args.ContainsKey(argument.argument)) {
+ return RunClient(newcommand, args);
+ }
+ }
- if (!providedusage) {
- string usageparse = "{COMMAND_" + ns.name.ToUpper() + "_" + cmd.name.ToUpper() + "_USAGE}";
- if (usageparse == Localization.Parse(usageparse))
- usageparse = "";
- else
- usageparse = Shiftorium.UpgradeInstalled("help_usage") ? Localization.Parse("{ERROR}{USAGE}" + usageparse, new Dictionary<string, string>() {
+ var requiresArgs = method.GetCustomAttributes<RequiresArgument>();
+ bool error = false;
+ bool providedusage = false;
+
+ foreach (RequiresArgument argument in requiresArgs)
+ {
+ if (!args.ContainsKey(argument.argument))
+ {
+
+ if (!providedusage)
+ {
+ string usageparse = "{COMMAND_" + ns.name.ToUpper() + "_" + cmd.name.ToUpper() + "_USAGE}";
+ if (usageparse == Localization.Parse(usageparse))
+ usageparse = "";
+ else
+ usageparse = Shiftorium.UpgradeInstalled("help_usage") ? Localization.Parse("{ERROR}{USAGE}" + usageparse, new Dictionary<string, string>() {
{"%ns", ns.name},
{"%cmd", cmd.name}
}) : "";
- Console.WriteLine(usageparse);
+ Console.WriteLine(usageparse);
- providedusage = true;
- }
-
- if (Shiftorium.UpgradeInstalled("help_usage")) {
- Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED}", new Dictionary<string, string>() {
+ providedusage = true;
+ }
+ if (Shiftorium.UpgradeInstalled("help_usage"))
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED}", new Dictionary<string, string>() {
{"%argument", argument.argument}
}));
- } else {
- Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED_NO_USAGE}"));
+ }
+ else
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED_NO_USAGE}"));
+ }
+
+ error = true;
+ }
+ }
+
+ if (error)
+ {
+ throw new Exception("{ERROR_COMMAND_WRONG}");
}
- error = true;
+ try
+ {
+ return (bool)method.Invoke(null, new[] { args });
+ }
+ catch (TargetInvocationException e)
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_EXCEPTION_THROWN_IN_METHOD}"));
+ Console.WriteLine(e.InnerException.Message);
+ Console.WriteLine(e.InnerException.StackTrace);
+ return true;
+ }
+ catch
+ {
+ return (bool)method.Invoke(null, new object[] { });
+ }
}
- }
+ else
+ {
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("session_mgr");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command while disconnected from the multi-user domain..");
+ return true;
- if (error) {
- throw new Exception("{ERROR_COMMAND_WRONG}");
+ }
}
-
- try {
- return (bool)method.Invoke(null, new[] { args });
- } catch (TargetInvocationException e) {
- Console.WriteLine(Localization.Parse("{ERROR_EXCEPTION_THROWN_IN_METHOD}"));
- Console.WriteLine(e.InnerException.Message);
- Console.WriteLine(e.InnerException.StackTrace);
+ else
+ {
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("watchdog");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command.");
+ KernelWatchdog.Log("potential_sys_breach", "user attempted to run kernel mode command " + text + " - watchdog has prevented this, good sir.");
return true;
- } catch {
- return (bool)method.Invoke(null, new object[] { });
}
}
+
+
}
}
} else {
@@ -250,21 +323,90 @@ namespace ShiftOS.Engine {
}
}
+ else
+ {
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("session_mgr");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command while disconnected from the multi-user domain..");
+ return true;
+
+ }
+ }
+ else
+ {
+
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("watchdog");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command.");
+ KernelWatchdog.Log("potential_sys_breach", "user attempted to run kernel mode command " + text + " - watchdog has prevented this, good sir.");
+ return true;
}
}
}
}
-
}
}
} catch { }
}
return false;
}
+ public static void PrintPrompt()
+ {
+ if (SaveSystem.CurrentSave != null)
+ {
+ ConsoleEx.BackgroundColor = SkinEngine.LoadedSkin.TerminalBackColorCC;
+ ConsoleEx.Italic = false;
+ ConsoleEx.Underline = false;
+
+ ConsoleEx.ForegroundColor = ConsoleColor.Magenta;
+ ConsoleEx.Bold = true;
+
+ Console.Write(SaveSystem.CurrentSave.Username);
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.Gray;
+ Console.Write("@");
+ ConsoleEx.Italic = true;
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.Yellow;
+ Console.Write(SaveSystem.CurrentSave.SystemName);
+ ConsoleEx.Italic = false;
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.Gray;
+ Console.Write(":~");
+ Console.ForegroundColor = ConsoleColor.White;
+ ConsoleEx.Italic = true;
+ if (KernelWatchdog.InKernelMode == true)
+ Console.Write("#");
+ else
+ Console.Write("$");
+ ConsoleEx.Italic = false;
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ Console.Write(" ");
+ }
+ }
+
- static TerminalBackend() {
- ServerMessageReceived onMessageReceived = (msg) => {
- if (msg.Name == "trm_invokecommand") {
+ static TerminalBackend()
+ {
+ ServerMessageReceived onMessageReceived = (msg) =>
+ {
+ if (msg.Name == "trm_invokecommand")
+ {
string text3 = "";
string text4 = msg.Contents;