diff --git a/TGCommandLine/DDCommands.cs b/TGCommandLine/DDCommands.cs index 63170b1e3d..09f6bda7dc 100644 --- a/TGCommandLine/DDCommands.cs +++ b/TGCommandLine/DDCommands.cs @@ -9,7 +9,7 @@ namespace TGCommandLine public DDCommand() { Keyword = "dd"; - Children = new Command[] { new DDStartCommand(), new DDStopCommand(), new DDRestartCommand(), new DDStatusCommand(), new DDAutostartCommand(), new DDPortCommand(), new DDVisibilityCommand(), new DDSecurityCommand() }; + Children = new Command[] { new DDStartCommand(), new DDStopCommand(), new DDRestartCommand(), new DDStatusCommand(), new DDAutostartCommand(), new DDPortCommand(), new DDSecurityCommand(), new DDWorldAnnounceCommand(), new DDWebclientCommand() }; } public override string GetHelpText() { @@ -17,6 +17,32 @@ namespace TGCommandLine } } + class DDWorldAnnounceCommand : Command + { + public DDWorldAnnounceCommand() + { + Keyword = "announce"; + RequiredParameters = 1; + } + + public override string GetHelpText() + { + return "Sends a message all players on the server"; + } + + public override string GetArgumentString() + { + return ""; + } + + protected override ExitCode Run(IList parameters) + { + var res = Server.GetComponent().WorldAnnounce(String.Join(" ", parameters)); + OutputProc(res ?? "Success!"); + return res == null ? ExitCode.Normal : ExitCode.ServerError; + } + } + class DDStartCommand : Command { public DDStartCommand() @@ -165,6 +191,45 @@ namespace TGCommandLine return "Change or check autostarting of the game server with the service"; } } + class DDWebclientCommand : Command + { + public DDWebclientCommand() + { + Keyword = "webclient"; + RequiredParameters = 1; + } + + protected override ExitCode Run(IList parameters) + { + var DD = Server.GetComponent(); + switch (parameters[0].ToLower()) + { + case "on": + DD.SetWebclient(true); + break; + case "off": + DD.SetWebclient(false); + break; + case "check": + OutputProc("Webclient is: " + (DD.Webclient() ? "Enabled" : "Disabled")); + break; + default: + OutputProc("Invalid parameter: " + parameters[0]); + return ExitCode.BadCommand; + } + return ExitCode.Normal; + } + + public override string GetArgumentString() + { + return ""; + } + public override string GetHelpText() + { + return "Change or check if the BYOND webclient is enabled for the game server"; + } + } + class DDPortCommand : Command { public DDPortCommand() @@ -201,50 +266,6 @@ namespace TGCommandLine } } - class DDVisibilityCommand : Command - { - public DDVisibilityCommand() - { - Keyword = "set-visibility"; - RequiredParameters = 1; - } - - protected override ExitCode Run(IList parameters) - { - TGDreamDaemonVisibility vis; - switch (parameters[0].ToLower()) - { - case "invisible": - case "invis": - vis = TGDreamDaemonVisibility.Invisible; - break; - case "private": - case "priv": - vis = TGDreamDaemonVisibility.Private; - break; - case "public": - case "pub": - vis = TGDreamDaemonVisibility.Public; - break; - default: - OutputProc("Invalid visiblity word!"); - return ExitCode.BadCommand; - } - Server.GetComponent().SetVisibility(vis); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Sets the visibility option for the DreamDaemon world. Requires a server restart to apply and queues a graceful one up"; - } - - public override string GetArgumentString() - { - return ""; - } - } - class DDSecurityCommand : Command { public DDSecurityCommand() diff --git a/TGCommandLine/RootCommands.cs b/TGCommandLine/RootCommands.cs index 4a4c6d1e0a..88ebf4973b 100644 --- a/TGCommandLine/RootCommands.cs +++ b/TGCommandLine/RootCommands.cs @@ -27,22 +27,44 @@ namespace TGCommandLine protected override ExitCode Run(IList parameters) { var gen_cl = parameters.Count > 1 && parameters[1].ToLower() == "--cl"; - TGRepoUpdateMethod method; + var Repo = Server.GetComponent(); switch (parameters[0].ToLower()) { case "hard": - method = TGRepoUpdateMethod.Hard; + var res = Repo.Update(true); + if (res != null) + { + OutputProc(res); + return ExitCode.ServerError; + } break; case "merge": - method = TGRepoUpdateMethod.Merge; + res = Repo.Update(false); + if (res != null) + { + OutputProc(res); + return ExitCode.ServerError; + } break; default: OutputProc("Please specify hard or merge"); return ExitCode.BadCommand; } - var result = Server.GetComponent().UpdateServer(method, gen_cl); - OutputProc(result ?? "Compilation started!"); - return result == null ? ExitCode.Normal : ExitCode.ServerError; + if (gen_cl) + { + Repo.GenerateChangelog(out string res); + if (res != null) + OutputProc(res); + else + { + res = Repo.PushChangelog(); + if (res != null) + OutputProc(res); + } + } + var resu = Server.GetComponent().Compile(true); + OutputProc(resu ? "Compilation started!" : "Compilation could not be started!"); + return resu ? ExitCode.Normal : ExitCode.ServerError; } public override string GetArgumentString() @@ -77,9 +99,22 @@ namespace TGCommandLine OutputProc("Invalid tesmerge #: " + parameters[0]); return ExitCode.BadCommand; } - var result = Server.GetComponent().UpdateServer(TGRepoUpdateMethod.None, false, tm); - OutputProc(result ?? "Compilation started!"); - return result == null ? ExitCode.Normal : ExitCode.ServerError; + var Repo = Server.GetComponent(); + var res = Repo.MergePullRequest(tm); + if (res != null) + { + OutputProc(res); + return ExitCode.ServerError; + } + Repo.GenerateChangelog(out res); + if (res != null) + { + OutputProc(res); + return ExitCode.ServerError; + } + var resu = Server.GetComponent().Compile(true); + OutputProc(resu ? "Compilation started!" : "Compilation could not be started!"); + return resu ? ExitCode.Normal : ExitCode.ServerError; } public override string GetArgumentString() { diff --git a/TGControlPanel/Main.Designer.cs b/TGControlPanel/Main.Designer.cs index 20c4e75974..8a215ebde3 100644 --- a/TGControlPanel/Main.Designer.cs +++ b/TGControlPanel/Main.Designer.cs @@ -71,7 +71,10 @@ this.MajorVersionNumeric = new System.Windows.Forms.NumericUpDown(); this.UpdateProgressBar = new System.Windows.Forms.ProgressBar(); this.ServerPanel = new System.Windows.Forms.TabPage(); - this.VisibilitySelector = new System.Windows.Forms.ComboBox(); + this.AutostartCheckbox = new System.Windows.Forms.CheckBox(); + this.WebclientCheckBox = new System.Windows.Forms.CheckBox(); + this.WorldAnnounceButton = new System.Windows.Forms.Button(); + this.WorldAnnounceField = new System.Windows.Forms.TextBox(); this.VisibilityTitle = new System.Windows.Forms.Label(); this.SecuritySelector = new System.Windows.Forms.ComboBox(); this.SecurityTitle = new System.Windows.Forms.Label(); @@ -96,7 +99,6 @@ this.ServerRestartButton = new System.Windows.Forms.Button(); this.ServerStopButton = new System.Windows.Forms.Button(); this.ServerStartButton = new System.Windows.Forms.Button(); - this.AutostartCheckbox = new System.Windows.Forms.CheckBox(); this.CompilerStatusLabel = new System.Windows.Forms.Label(); this.CompilerLabel = new System.Windows.Forms.Label(); this.compileButton = new System.Windows.Forms.Button(); @@ -722,7 +724,10 @@ // ServerPanel // this.ServerPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(39)))), ((int)(((byte)(40)))), ((int)(((byte)(34))))); - this.ServerPanel.Controls.Add(this.VisibilitySelector); + this.ServerPanel.Controls.Add(this.AutostartCheckbox); + this.ServerPanel.Controls.Add(this.WebclientCheckBox); + this.ServerPanel.Controls.Add(this.WorldAnnounceButton); + this.ServerPanel.Controls.Add(this.WorldAnnounceField); this.ServerPanel.Controls.Add(this.VisibilityTitle); this.ServerPanel.Controls.Add(this.SecuritySelector); this.ServerPanel.Controls.Add(this.SecurityTitle); @@ -747,7 +752,6 @@ this.ServerPanel.Controls.Add(this.ServerRestartButton); this.ServerPanel.Controls.Add(this.ServerStopButton); this.ServerPanel.Controls.Add(this.ServerStartButton); - this.ServerPanel.Controls.Add(this.AutostartCheckbox); this.ServerPanel.Controls.Add(this.CompilerStatusLabel); this.ServerPanel.Controls.Add(this.CompilerLabel); this.ServerPanel.Controls.Add(this.compileButton); @@ -762,20 +766,52 @@ this.ServerPanel.TabIndex = 2; this.ServerPanel.Text = "Server"; // - // VisibilitySelector + // AutostartCheckbox // - this.VisibilitySelector.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.VisibilitySelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.VisibilitySelector.FormattingEnabled = true; - this.VisibilitySelector.Items.AddRange(new object[] { - "Public", - "Private", - "Invisible"}); - this.VisibilitySelector.Location = new System.Drawing.Point(566, 136); - this.VisibilitySelector.Name = "VisibilitySelector"; - this.VisibilitySelector.Size = new System.Drawing.Size(121, 21); - this.VisibilitySelector.TabIndex = 40; - this.VisibilitySelector.SelectedIndexChanged += new System.EventHandler(this.VisibilitySelector_SelectedIndexChanged); + this.AutostartCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.AutostartCheckbox.AutoSize = true; + this.AutostartCheckbox.Font = new System.Drawing.Font("Verdana", 12F); + this.AutostartCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(242))))); + this.AutostartCheckbox.Location = new System.Drawing.Point(758, 0); + this.AutostartCheckbox.Name = "AutostartCheckbox"; + this.AutostartCheckbox.Size = new System.Drawing.Size(104, 22); + this.AutostartCheckbox.TabIndex = 15; + this.AutostartCheckbox.Text = "Autostart"; + this.AutostartCheckbox.UseVisualStyleBackColor = true; + this.AutostartCheckbox.CheckedChanged += new System.EventHandler(this.AutostartCheckbox_CheckedChanged); + // + // WebclientCheckBox + // + this.WebclientCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.WebclientCheckBox.AutoSize = true; + this.WebclientCheckBox.Font = new System.Drawing.Font("Verdana", 12F); + this.WebclientCheckBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(242))))); + this.WebclientCheckBox.Location = new System.Drawing.Point(758, 28); + this.WebclientCheckBox.Name = "WebclientCheckBox"; + this.WebclientCheckBox.Size = new System.Drawing.Size(108, 22); + this.WebclientCheckBox.TabIndex = 42; + this.WebclientCheckBox.Text = "Webclient"; + this.WebclientCheckBox.UseVisualStyleBackColor = true; + this.WebclientCheckBox.CheckedChanged += new System.EventHandler(this.WebclientCheckBox_CheckedChanged); + // + // WorldAnnounceButton + // + this.WorldAnnounceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.WorldAnnounceButton.Location = new System.Drawing.Point(785, 136); + this.WorldAnnounceButton.Name = "WorldAnnounceButton"; + this.WorldAnnounceButton.Size = new System.Drawing.Size(77, 20); + this.WorldAnnounceButton.TabIndex = 41; + this.WorldAnnounceButton.Text = "Send"; + this.WorldAnnounceButton.UseVisualStyleBackColor = true; + this.WorldAnnounceButton.Click += new System.EventHandler(this.WorldAnnounceButton_Click); + // + // WorldAnnounceField + // + this.WorldAnnounceField.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.WorldAnnounceField.Location = new System.Drawing.Point(566, 136); + this.WorldAnnounceField.Name = "WorldAnnounceField"; + this.WorldAnnounceField.Size = new System.Drawing.Size(213, 20); + this.WorldAnnounceField.TabIndex = 40; // // VisibilityTitle // @@ -783,11 +819,11 @@ this.VisibilityTitle.AutoSize = true; this.VisibilityTitle.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.VisibilityTitle.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(242))))); - this.VisibilityTitle.Location = new System.Drawing.Point(474, 139); + this.VisibilityTitle.Location = new System.Drawing.Point(466, 139); this.VisibilityTitle.Name = "VisibilityTitle"; - this.VisibilityTitle.Size = new System.Drawing.Size(86, 18); + this.VisibilityTitle.Size = new System.Drawing.Size(94, 18); this.VisibilityTitle.TabIndex = 39; - this.VisibilityTitle.Text = "Visibility:"; + this.VisibilityTitle.Text = "Announce:"; this.VisibilityTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // SecuritySelector @@ -1079,20 +1115,6 @@ this.ServerStartButton.UseVisualStyleBackColor = true; this.ServerStartButton.Click += new System.EventHandler(this.ServerStartButton_Click); // - // AutostartCheckbox - // - this.AutostartCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.AutostartCheckbox.AutoSize = true; - this.AutostartCheckbox.Font = new System.Drawing.Font("Verdana", 12F); - this.AutostartCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(242))))); - this.AutostartCheckbox.Location = new System.Drawing.Point(758, 17); - this.AutostartCheckbox.Name = "AutostartCheckbox"; - this.AutostartCheckbox.Size = new System.Drawing.Size(104, 22); - this.AutostartCheckbox.TabIndex = 15; - this.AutostartCheckbox.Text = "Autostart"; - this.AutostartCheckbox.UseVisualStyleBackColor = true; - this.AutostartCheckbox.CheckedChanged += new System.EventHandler(this.AutostartCheckbox_CheckedChanged); - // // CompilerStatusLabel // this.CompilerStatusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) @@ -1608,7 +1630,6 @@ this.AdminModeSpecial.TabStop = true; this.AdminModeSpecial.Text = "Channel Mode"; this.AdminModeSpecial.UseVisualStyleBackColor = true; - this.AdminModeNormal.CheckedChanged += new System.EventHandler(this.AdminModeSpecial_CheckedChanged); // // AdminModeNormal // @@ -2082,7 +2103,6 @@ private System.Windows.Forms.NumericUpDown PortSelector; private System.Windows.Forms.Label ProjectPathLabel; private System.Windows.Forms.TextBox projectNameText; - private System.Windows.Forms.Button CompileCancelButton; private System.Windows.Forms.Label ServerPathLabel; private System.Windows.Forms.TextBox ServerPathTextbox; private System.Windows.Forms.Label LatestVersionLabel; @@ -2159,7 +2179,6 @@ private System.Windows.Forms.ComboBox SecuritySelector; private System.Windows.Forms.Label SecurityTitle; private System.Windows.Forms.Label VisibilityTitle; - private System.Windows.Forms.ComboBox VisibilitySelector; private System.ComponentModel.BackgroundWorker ServerStartBGW; private System.Windows.Forms.Button RepoRefreshButton; private System.Windows.Forms.ComboBox IRCModesComboBox; @@ -2175,5 +2194,9 @@ private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button WorldAnnounceButton; + private System.Windows.Forms.TextBox WorldAnnounceField; + private System.Windows.Forms.Button CompileCancelButton; + private System.Windows.Forms.CheckBox WebclientCheckBox; } } diff --git a/TGControlPanel/ServerPage.cs b/TGControlPanel/ServerPage.cs index 97cf19924a..b5d1e04bd9 100644 --- a/TGControlPanel/ServerPage.cs +++ b/TGControlPanel/ServerPage.cs @@ -17,7 +17,7 @@ namespace TGControlPanel } FullUpdateAction fuAction; - int testmergePR; + ushort testmergePR; string updateError; bool updatingFields = false; @@ -104,6 +104,7 @@ namespace TGControlPanel initializeButton.Visible = RepoExists; NudgePortSelector.Visible = RepoExists; AutostartCheckbox.Visible = RepoExists; + WebclientCheckBox.Visible = RepoExists; PortSelector.Visible = RepoExists; projectNameText.Visible = RepoExists; compilerProgressBar.Visible = RepoExists; @@ -125,6 +126,8 @@ namespace TGControlPanel UpdateMergeButton.Visible = RepoExists; UpdateTestmergeButton.Visible = RepoExists; ResetTestmerge.Visible = RepoExists; + WorldAnnounceField.Visible = RepoExists; + WorldAnnounceButton.Visible = RepoExists; var DM = Server.GetComponent(); var DD = Server.GetComponent(); @@ -137,8 +140,7 @@ namespace TGControlPanel if (!ServerPathTextbox.Focused) ServerPathTextbox.Text = Config.ServerDirectory(); - - VisibilitySelector.SelectedIndex = (int)DD.VisibilityLevel(); + SecuritySelector.SelectedIndex = (int)DD.SecurityLevel(); if (!RepoExists) @@ -156,6 +158,7 @@ namespace TGControlPanel ServerGStopButton.Enabled = !ShuttingDown; AutostartCheckbox.Checked = DD.Autostart(); + WebclientCheckBox.Checked = DD.Webclient(); if (!PortSelector.Focused) PortSelector.Value = DD.Port(); if (!projectNameText.Focused) @@ -246,7 +249,7 @@ namespace TGControlPanel Server.GetComponent().SetPort((ushort)PortSelector.Value); } - private void RunServerUpdate(FullUpdateAction fua, int tm = 0) + private void RunServerUpdate(FullUpdateAction fua, ushort tm = 0) { if (FullUpdateWorker.IsBusy) return; @@ -373,25 +376,64 @@ namespace TGControlPanel return; Server.GetComponent().RequestRestart(); } + + private void FullUpdateWorker_DoWork(object sender, DoWorkEventArgs e) { - var Updater = Server.GetComponent(); + var Repo = Server.GetComponent(); + var DM = Server.GetComponent(); switch (fuAction) { case FullUpdateAction.Testmerge: - updateError = Updater.UpdateServer(TGRepoUpdateMethod.None, false, (ushort)testmergePR); + updateError = Repo.MergePullRequest(testmergePR); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + updateError = DM.Compile(true) ? updateError : "Compilation failed!"; + } break; case FullUpdateAction.UpdateHard: - updateError = Updater.UpdateServer(TGRepoUpdateMethod.Hard, true); + updateError = Repo.Update(true); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + if(updateError == null) + updateError = Repo.PushChangelog(); + updateError = DM.Compile(true) ? updateError : "Compilation failed!"; + } break; case FullUpdateAction.UpdateHardTestmerge: - updateError = Updater.UpdateServer(TGRepoUpdateMethod.Hard, true, (ushort)testmergePR); + updateError = Repo.Update(true); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + if (updateError == null) + updateError = Repo.PushChangelog(); + updateError = Repo.MergePullRequest(testmergePR); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + updateError = DM.Compile(true) ? updateError : "Compilation failed!"; + } + } break; case FullUpdateAction.UpdateMerge: - updateError = Updater.UpdateServer(TGRepoUpdateMethod.Merge, true, (ushort)testmergePR); + updateError = Repo.Update(false); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + if (updateError == null) + Repo.PushChangelog(); //not an error 99% of the time if this fails, just a dirty tree + updateError = DM.Compile(true) ? updateError : "Compilation failed!"; + } break; case FullUpdateAction.Reset: - updateError = Updater.UpdateServer(TGRepoUpdateMethod.Reset, false, 0); + updateError = Repo.Reset(true); + if (updateError == null) + { + Repo.GenerateChangelog(out updateError); + updateError = DM.Compile(true) ? updateError : "Compilation failed!"; + } break; } } @@ -407,7 +449,7 @@ namespace TGControlPanel private void UpdateTestmergeButton_Click(object sender, System.EventArgs e) { - RunServerUpdate(FullUpdateAction.UpdateHardTestmerge, (int)ServerTestmergeInput.Value); + RunServerUpdate(FullUpdateAction.UpdateHardTestmerge, (ushort)ServerTestmergeInput.Value); } private void UpdateMergeButton_Click(object sender, System.EventArgs e) @@ -416,7 +458,7 @@ namespace TGControlPanel } private void TestmergeButton_Click(object sender, System.EventArgs e) { - RunServerUpdate(FullUpdateAction.Testmerge, (int)ServerTestmergeInput.Value); + RunServerUpdate(FullUpdateAction.Testmerge, (ushort)ServerTestmergeInput.Value); } private void NudgePortSelector_ValueChanged(object sender, EventArgs e) @@ -432,11 +474,24 @@ namespace TGControlPanel MessageBox.Show("Security change will be applied after next server reboot."); } - private void VisibilitySelector_SelectedIndexChanged(object sender, EventArgs e) + private void WorldAnnounceButton_Click(object sender, EventArgs e) + { + var msg = WorldAnnounceField.Text; + if (!String.IsNullOrWhiteSpace(msg)) { + var res = Server.GetComponent().WorldAnnounce(msg); + if(res != null) + { + MessageBox.Show(res); + return; + } + } + WorldAnnounceField.Text = ""; + } + + private void WebclientCheckBox_CheckedChanged(object sender, EventArgs e) { if (!updatingFields) - if (!Server.GetComponent().SetVisibility((TGDreamDaemonVisibility)VisibilitySelector.SelectedIndex)) - MessageBox.Show("Visibility change will be applied after next server reboot."); + Server.GetComponent().SetWebclient(WebclientCheckBox.Checked); } } } diff --git a/TGInstallerWrapper/Main.cs b/TGInstallerWrapper/Main.cs index 09f1b8243b..0372aa7204 100644 --- a/TGInstallerWrapper/Main.cs +++ b/TGInstallerWrapper/Main.cs @@ -68,6 +68,21 @@ namespace TGInstallerWrapper string logfile = null; try { + while (true) + { + var res = PromptKillProcess("TGCommandLine"); + if (res == PKillType.Aborted) + return; + else if (res == PKillType.Killed) + continue; + res = PromptKillProcess("TGControlPanel"); + if (res == PKillType.Aborted) + return; + else if (res == PKillType.Killed) + continue; + break; + } + var args = new List(); if (!pathIsDefault) args.Add(String.Format("INSTALLFOLDER=\"{0}\"", PathTextBox.Text)); @@ -114,21 +129,6 @@ namespace TGInstallerWrapper } } - while (true) - { - var res = PromptKillProcess("TGCommandLine"); - if (res == PKillType.Aborted) - return; - else if (res == PKillType.Killed) - continue; - res = PromptKillProcess("TGControlPanel"); - if (res == PKillType.Aborted) - return; - else if (res == PKillType.Killed) - continue; - break; - } - InstallCancelButton.Enabled = true; if (ShowLogCheckbox.Checked) diff --git a/TGServerService/App.config b/TGServerService/App.config index 8e565d7e93..6eb925f561 100644 --- a/TGServerService/App.config +++ b/TGServerService/App.config @@ -31,9 +31,6 @@ 0 - - 2 - False @@ -64,6 +61,9 @@ + + False + diff --git a/TGServerService/Chat.cs b/TGServerService/Chat.cs index 7d3ab39b8b..cafc390697 100644 --- a/TGServerService/Chat.cs +++ b/TGServerService/Chat.cs @@ -147,7 +147,9 @@ namespace TGServerService Server = this, }; TGServerService.WriteInfo(String.Format("Chat Command from {0} ({2}): {1}", speaker, String.Join(" ", asList), channel), TGServerService.EventID.ChatCommand); - new RootChatCommand().DoRun(asList); + if (ServerChatCommands == null) + LoadServerChatCommands(); + new RootChatCommand(ServerChatCommands).DoRun(asList); } //cleanup and save diff --git a/TGServerService/ChatCommands.cs b/TGServerService/ChatCommands.cs index 9ca1d13831..05bbd39394 100644 --- a/TGServerService/ChatCommands.cs +++ b/TGServerService/ChatCommands.cs @@ -1,7 +1,7 @@ using TGServiceInterface; -using System.Threading; -using System.Collections.Generic; using System; +using System.Collections.Generic; +using System.Threading; namespace TGServerService { @@ -36,12 +36,42 @@ namespace TGServerService return base.DoRun(parameters); } } + + class ServerChatCommand : ChatCommand + { + readonly string HelpText; + public ServerChatCommand(string name, string helpText, bool adminOnly, int requiredParameters) + { + Keyword = name; + RequiresAdmin = adminOnly; + HelpText = helpText; + RequiredParameters = requiredParameters; + } + + public override string GetHelpText() + { + return HelpText; + } + + protected override ExitCode Run(IList parameters) + { + var res = Instance.SendCommand(String.Format("{0};sender={1};custom=\"{2}\"", Keyword, CommandInfo.Value.Speaker, String.Join(" ", parameters))); + if (res != "SUCESS" && !String.IsNullOrWhiteSpace(res)) + OutputProc(res); + return ExitCode.Normal; + } + } + class RootChatCommand : RootCommand { - public RootChatCommand() + public RootChatCommand(List serverCommands) { + var tmp = new List { new PRsCommand(), new VersionCommand(), new RevisionCommand(), new ByondCommand(), new KekCommand() }; + if (serverCommands != null) + tmp.AddRange(serverCommands); + Children = tmp.ToArray(); + serverCommands = new List(); PrintHelpList = true; - Children = new Command[] { new CheckCommand(), new StatusCommand(), new PRsCommand(), new VersionCommand(), new AHelpCommand(), new NameCheckCommand(), new RevisionCommand(), new AdminWhoCommand(), new ByondCommand(), new KekCommand(), new RelayRestartCommand() }; } } class RevisionCommand : ChatCommand @@ -52,58 +82,13 @@ namespace TGServerService } protected override ExitCode Run(IList parameters) { - OutputProc(Instance.GetHead(out string error) ?? error); + OutputProc(String.Format("^{0}", Instance.GetHead(out string error)) ?? error); return error == null ? ExitCode.Normal : ExitCode.ServerError; } public override string GetHelpText() { - return "Returns mob info of the specified target"; - } - } - class NameCheckCommand : ChatCommand - { - public NameCheckCommand() - { - Keyword = "namecheck"; - RequiredParameters = 1; - RequiresAdmin = true; - } - protected override ExitCode Run(IList parameters) - { - OutputProc(Instance.NameCheck(parameters[0], CommandInfo.Value.Speaker)); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Returns mob info of the specified target"; - } - public override string GetArgumentString() - { - return ""; - } - } - class AdminWhoCommand : ChatCommand - { - public AdminWhoCommand() - { - Keyword = "adminwho"; - RequiresAdmin = true; - } - protected override ExitCode Run(IList parameters) - { - OutputProc(Instance.SendCommand(TGStationServer.SCAdminWho)); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Returns mob info of the specified target"; - } - public override string GetArgumentString() - { - return ""; + return "Prints the current code revision of the repository (not the server)"; } } @@ -134,42 +119,6 @@ namespace TGServerService return "[--staged|--latest]"; } } - class CheckCommand : ChatCommand - { - public CheckCommand() - { - Keyword = "check"; - } - protected override ExitCode Run(IList parameters) - { - OutputProc(Instance.StatusString(CommandInfo.Value.IsAdmin && CommandInfo.Value.IsAdminChannel)); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Gets the playercount, gamemode, and address of the server"; - } - } - - class StatusCommand : ChatCommand - { - public StatusCommand() - { - Keyword = "status"; - RequiresAdmin = true; - } - protected override ExitCode Run(IList parameters) - { - OutputProc(Instance.SendCommand(TGStationServer.SCIRCStatus)); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Gets the admincount, playercount, gamemode, and true game mode of the server"; - } - } class VersionCommand : ChatCommand { public VersionCommand() @@ -224,7 +173,7 @@ namespace TGServerService { res = ""; foreach (var I in PRs) - res += I.Number + " "; + res += "#" + I.Number + " "; OutputProc(res); } return ExitCode.Normal; @@ -235,49 +184,5 @@ namespace TGServerService return "Gets the currently merged pull requests in the repository"; } } - - class AHelpCommand : ChatCommand - { - public AHelpCommand() - { - Keyword = "ahelp"; - RequiresAdmin = true; - RequiredParameters = 2; - } - protected override ExitCode Run(IList parameters) - { - var ckey = parameters[0]; - parameters.RemoveAt(0); - OutputProc(Instance.SendPM(ckey, CommandInfo.Value.Speaker, String.Join(" ", parameters))); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Respond to a relayed admin help request"; - } - - public override string GetArgumentString() - { - return " |list>>"; - } - } - class RelayRestartCommand : ChatCommand - { - public RelayRestartCommand() - { - Keyword = "relayrestart"; - RequiresAdmin = true; - } - protected override ExitCode Run(IList parameters) - { - Instance.InitInterop(); - return ExitCode.Normal; - } - - public override string GetHelpText() - { - return "Restart the relay listener. This is a massive hack but it'll do for now"; - } - } + } diff --git a/TGServerService/Compiler.cs b/TGServerService/Compiler.cs index 70ab29c161..2b9739fb4e 100644 --- a/TGServerService/Compiler.cs +++ b/TGServerService/Compiler.cs @@ -352,6 +352,11 @@ namespace TGServerService //just the tip const string GitLogsDir = "/.git/logs"; Program.CopyDirectory(RepoPath + GitLogsDir, resurrectee + GitLogsDir); + try + { + File.Copy(PRJobFile, resurrectee + Path.DirectorySeparatorChar + PRJobFile); + } + catch { } } finally { diff --git a/TGServerService/DreamDaemon.cs b/TGServerService/DreamDaemon.cs index d523a3548b..c53843dbab 100644 --- a/TGServerService/DreamDaemon.cs +++ b/TGServerService/DreamDaemon.cs @@ -31,7 +31,6 @@ namespace TGServerService bool RestartInProgress = false; TGDreamDaemonSecurity StartingSecurity; - TGDreamDaemonVisibility StartingVisiblity; ShutdownRequestPhase AwaitingShutdown; @@ -57,6 +56,7 @@ namespace TGServerService currentStatus = TGDreamDaemonStatus.Online; DDWatchdog = new Thread(new ThreadStart(Watchdog)); DDWatchdog.Start(); + RequestRestart(); //TODO: Remove this when DD -> Service communication is more } catch (Exception e) { @@ -364,23 +364,6 @@ namespace TGServerService } } - //same thing with visibility - string VisibilityWord(bool starting = false) - { - var level = starting ? StartingVisiblity : (TGDreamDaemonVisibility)Properties.Settings.Default.ServerVisiblity; - switch (level) - { - case TGDreamDaemonVisibility.Invisible: - return "invisible"; - case TGDreamDaemonVisibility.Private: - return "private"; - case TGDreamDaemonVisibility.Public: - return "public"; - default: - throw new Exception(String.Format("Bad DreamDaemon visibility level: {0}", level)); - } - } - //used by Start and Watchdog to start a DD instance string StartImpl(bool watchdog) { @@ -396,9 +379,8 @@ namespace TGServerService var DMB = GameDirLive + "/" + Config.ProjectName + ".dmb"; GenCommsKey(); - StartingVisiblity = (TGDreamDaemonVisibility)Config.ServerVisiblity; StartingSecurity = (TGDreamDaemonSecurity)Config.ServerSecurity; - Proc.StartInfo.Arguments = String.Format("{0} -port {1} -close -verbose -params server_service={4} -{2} -{3}", DMB, Config.ServerPort, SecurityWord(), VisibilityWord(), serviceCommsKey); + Proc.StartInfo.Arguments = String.Format("{0} -port {1} {5}-close -verbose -params \"server_service={3}&server_service_version={4}\" -{2} -public", DMB, Config.ServerPort, SecurityWord(), serviceCommsKey, Version(), Config.Webclient ? "-webclient" : ""); InitInterop(); Proc.Start(); @@ -429,31 +411,6 @@ namespace TGServerService } } - //public api - public TGDreamDaemonVisibility VisibilityLevel() - { - lock (watchdogLock) - { - return (TGDreamDaemonVisibility)Properties.Settings.Default.ServerVisiblity; - } - } - - //public api - public bool SetVisibility(TGDreamDaemonVisibility NewVis) - { - var Config = Properties.Settings.Default; - var visInt = (int)NewVis; - bool needReboot; - lock (watchdogLock) - { - needReboot = Config.ServerVisiblity != visInt; - Config.ServerVisiblity = visInt; - } - if (needReboot) - RequestRestart(); - return DaemonStatus() != TGDreamDaemonStatus.Online; - } - //public api public TGDreamDaemonSecurity SecurityLevel() { @@ -494,7 +451,7 @@ namespace TGServerService //public api public string StatusString(bool includeMetaInfo) { - const string visSecStr = " (Vis: {0}, Sec: {1})"; + const string visSecStr = " (Sec: {0})"; string res; var ds = DaemonStatus(); switch (ds) @@ -506,13 +463,13 @@ namespace TGServerService res = "REBOOTING"; break; case TGDreamDaemonStatus.Online: - res = SendCommand(SCIRCCheck); + res = "ONLINE"; if (includeMetaInfo) { string secandvis; lock (watchdogLock) { - secandvis = String.Format(visSecStr, VisibilityWord(true), SecurityWord(true)); + secandvis = String.Format(visSecStr, SecurityWord(true)); } res += secandvis; } @@ -522,7 +479,7 @@ namespace TGServerService break; } if (includeMetaInfo && ds != TGDreamDaemonStatus.Online) - res += String.Format(visSecStr, VisibilityWord(), SecurityWord()); + res += String.Format(visSecStr, SecurityWord()); return res; } @@ -540,5 +497,34 @@ namespace TGServerService return AwaitingShutdown != ShutdownRequestPhase.None; } } + + /// + public string WorldAnnounce(string message) + { + var res = SendCommand(SCWorldAnnounce + ";message=" + message); + if (res == "SUCCESS") + return null; + return res; + } + + /// + public bool Webclient() + { + return Properties.Settings.Default.Webclient; + } + + /// + public void SetWebclient(bool on) + { + var Config = Properties.Settings.Default; + lock (watchdogLock) { + var diff = on != Config.Webclient; + if (diff) + { + Config.Webclient = on; + RequestRestart(); + } + } + } } } diff --git a/TGServerService/InterfaceBase.cs b/TGServerService/InterfaceBase.cs index e8ecc903ff..91d23b953c 100644 --- a/TGServerService/InterfaceBase.cs +++ b/TGServerService/InterfaceBase.cs @@ -9,7 +9,7 @@ namespace TGServerService //this line basically says make one instance of the service, use it multithreaded for requests, and never delete it [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] - partial class TGStationServer : IDisposable, ITGSService, ITGServerUpdater + partial class TGStationServer : IDisposable, ITGSService { //call partial constructors/destructors from here @@ -32,59 +32,12 @@ namespace TGServerService DisposeChat(); } + //public api public string Version() { return TGServerService.Version; } - //one stop update - public string UpdateServer(TGRepoUpdateMethod updateType, bool push_changelog_if_enabled, ushort testmerge_pr) - { - try - { - string res; - switch (updateType) - { - case TGRepoUpdateMethod.Hard: - case TGRepoUpdateMethod.Merge: - res = Update(updateType == TGRepoUpdateMethod.Hard); - if (res != null && res != RepoErrorUpToDate) - return res; - break; - case TGRepoUpdateMethod.Reset: - res = Reset(true); - if (res != null) - return res; - break; - case TGRepoUpdateMethod.None: - break; - } - - if (testmerge_pr != 0) - { - res = MergePullRequestImpl(testmerge_pr, true); - if (res != null && res != RepoErrorUpToDate) - return res; - } - - GenerateChangelog(out res); - if (res == null && push_changelog_if_enabled && SSHAuth()) - { - res = Commit(); - if (res == null) - res = Push(); - } - - if (!Compile(true)) - return "Compilation could not be started!"; - return res; - } - catch (Exception e) - { - return e.ToString(); - } - } - //public api public void VerifyConnection() { } diff --git a/TGServerService/Interop.cs b/TGServerService/Interop.cs index a2786a8af9..ccc5a6539c 100644 --- a/TGServerService/Interop.cs +++ b/TGServerService/Interop.cs @@ -4,6 +4,7 @@ using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; +using System.Web.Script.Serialization; using System.Web.Security; using TGServiceInterface; @@ -23,17 +24,36 @@ namespace TGServerService const string SCHardReboot = "hard_reboot"; //requests that dreamdaemon restarts when the round ends const string SCGracefulShutdown = "graceful_shutdown"; //requests that dreamdaemon stops when the round ends const string SCWorldAnnounce = "world_announce"; //sends param 'message' to the world - public const string SCIRCCheck = "irc_check"; //returns game stats - public const string SCIRCStatus = "irc_status"; //returns admin stats - public const string SCNameCheck = "namecheck"; //returns keywords lookup - const string SCAdminPM = "adminmsg"; //pms a target ckey - public const string SCAdminWho = "adminwho"; //lists admins + const string SCListCustomCommands = "list_custom_commands"; //Get a list of commands supported by the server const string SRKillProcess = "killme"; const string SRIRCBroadcast = "irc"; const string SRIRCAdminChannelMessage = "send2irc"; const string SRWorldReboot = "worldreboot"; + const string CCPHelpText = "help_text"; + const string CCPAdminOnly = "admin_only"; + const string CCPRequiredParameters = "required_parameters"; + + List ServerChatCommands; + + void LoadServerChatCommands() + { + if (DaemonStatus() != TGDreamDaemonStatus.Online) + return; + var json = SendCommand(SCListCustomCommands); + if (String.IsNullOrWhiteSpace(json)) + return; + List tmp = new List(); + try + { + foreach(var I in new JavaScriptSerializer().Deserialize>>(json)) + tmp.Add(new ServerChatCommand(I.Key, (string)I.Value[CCPHelpText], ((int)I.Value[CCPAdminOnly]) == 1, (int)I.Value[CCPRequiredParameters])); + ServerChatCommands = tmp; + } + catch { } + } + //raw command string sent here via world.ExportService void HandleCommand(string cmd) { @@ -54,6 +74,7 @@ namespace TGServerService break; case SRWorldReboot: TGServerService.WriteInfo("World Rebooted", TGServerService.EventID.WorldReboot); + ServerChatCommands = null; lock (CompilerLock) { if (UpdateStaged) @@ -76,21 +97,6 @@ namespace TGServerService } } - bool WorldAnnounce(string message) - { - return SendCommand(SCWorldAnnounce + ";message=" + message) == "SUCCESS" ; - } - - public string SendPM(string targetCkey, string sender, string message) - { - return SendCommand(String.Format("{3};target={0};sender={1};message={2}", targetCkey, sender, message, SCAdminPM)); - } - - public string NameCheck(string targetCkey, string sender) - { - return SendCommand(String.Format("{2};target={0};sender={1}", targetCkey, sender, SCNameCheck)); - } - //Fuckery to diddle byond with the right packet to accept our girth string SendTopic(string topicdata, ushort port) { @@ -122,7 +128,7 @@ namespace TGServerService string returnedString = "NULL"; try { - var returnedData = new byte[512]; + var returnedData = new byte[UInt16.MaxValue]; topicSender.Receive(returnedData); var raw_string = Encoding.ASCII.GetString(returnedData).TrimEnd(new char[] { (char)0 }).Trim(); if (raw_string.Length > 6) @@ -247,7 +253,8 @@ namespace TGServerService catch (Exception e) { TGServerService.WriteError("Nudge handler thread crashed: " + e.ToString(), TGServerService.EventID.NudgeCrash); - SendMessage("SERVICE: The relay handler crashed, use relayrestart to restore it! Error: " + e.Message, ChatMessageType.AdminInfo); + SendMessage("SERVICE: The relay handler crashed, I will attempt to restore it when the server reboots! Error: " + e.Message, ChatMessageType.AdminInfo); + RequestRestart(); } } diff --git a/TGServerService/Properties/Settings.Designer.cs b/TGServerService/Properties/Settings.Designer.cs index e0397af473..2f61b72c1b 100644 --- a/TGServerService/Properties/Settings.Designer.cs +++ b/TGServerService/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace TGServerService.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -107,18 +107,6 @@ namespace TGServerService.Properties { } } - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("2")] - public int ServerVisiblity { - get { - return ((int)(this["ServerVisiblity"])); - } - set { - this["ServerVisiblity"] = value; - } - } - [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] @@ -238,5 +226,17 @@ namespace TGServerService.Properties { this["ReattachCommsKey"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool Webclient { + get { + return ((bool)(this["Webclient"])); + } + set { + this["Webclient"] = value; + } + } } } diff --git a/TGServerService/Properties/Settings.settings b/TGServerService/Properties/Settings.settings index 803cc28afe..d28e35faa8 100644 --- a/TGServerService/Properties/Settings.settings +++ b/TGServerService/Properties/Settings.settings @@ -23,9 +23,6 @@ 0 - - 2 - False @@ -56,5 +53,8 @@ + + False + \ No newline at end of file diff --git a/TGServerService/Repository.cs b/TGServerService/Repository.cs index c5f98a172a..3f7d730435 100644 --- a/TGServerService/Repository.cs +++ b/TGServerService/Repository.cs @@ -300,6 +300,17 @@ namespace TGServerService SendMessage("REPO: Checking out object: " + sha, ChatMessageType.DeveloperInfo); try { + if(Repo.Branches[sha] == null) + { + //see if origin has the branch + var trackedBranch = Repo.Branches[String.Format("origin/{0}", sha)]; + if(trackedBranch != null) + { + var newBranch = Repo.CreateBranch(sha, trackedBranch.Tip); + //track it + Repo.Branches.Update(newBranch, b => b.TrackedBranch = trackedBranch.CanonicalName); + } + } var Opts = new CheckoutOptions() { CheckoutModifiers = CheckoutModifiers.Force, @@ -307,6 +318,7 @@ namespace TGServerService }; Commands.Checkout(Repo, sha, Opts); var res = ResetNoLock(null); + UpdateSubmodules(); SendMessage("REPO: Checkout complete!", ChatMessageType.DeveloperInfo); TGServerService.WriteInfo("Repo checked out " + sha, TGServerService.EventID.RepoCheckout); return res; @@ -364,11 +376,12 @@ namespace TGServerService }; fos.OnTransferProgress += HandleTransferProgress; Commands.Fetch(Repo, R.Name, refSpecs, fos, logMessage); - + var originBranch = Repo.Head.TrackedBranch; if (reset) { var error = ResetNoLock(Repo.Head.TrackedBranch); + UpdateSubmodules(); if (error != null) throw new Exception(error); DeletePRList(); @@ -378,6 +391,7 @@ namespace TGServerService var res = MergeBranch(originBranch.FriendlyName); if (res != null) throw new Exception(res); + UpdateSubmodules(); TGServerService.WriteInfo("Repo merge updated to " + originBranch.Tip.Sha, TGServerService.EventID.RepoMergeUpdate); return null; } @@ -390,6 +404,35 @@ namespace TGServerService } } + private void UpdateSubmodules() + { + var suo = new SubmoduleUpdateOptions + { + Init = true + }; + foreach (var I in Repo.Submodules) + try + { + Repo.Submodules.Update(I.Name, suo); + } + catch(Exception e) + { + //workaround for https://github.com/libgit2/libgit2/issues/3820 + //kill off the modules/ folder in .git and try again + try + { + Program.DeleteDirectory(String.Format("{0}/.git/modules/{1}", RepoPath, I.Path)); + } + catch { + throw e; + } + Repo.Submodules.Update(I.Name, suo); + var msg = String.Format("I had to reclone submodule {0}. If this is happening a lot find a better hack or fix https://github.com/libgit2/libgit2/issues/3820!", I.Name); + SendMessage(String.Format("REPO: {0}", msg), ChatMessageType.DeveloperInfo); + TGServerService.WriteWarning(msg, TGServerService.EventID.SubmoduleReclone); + } + } + string CreateBackup() { try @@ -557,6 +600,16 @@ namespace TGServerService //so we'll know if this fails var Result = MergeBranch(LocalBranchName); + if (Result == null) + try + { + UpdateSubmodules(); + } + catch (Exception e) + { + Result = e.ToString(); + } + if (Result == null) { TGServerService.WriteInfo(String.Format("Merged pull request #{0}", PRNumber), TGServerService.EventID.RepoPRMerge); @@ -671,7 +724,32 @@ namespace TGServerService } } - //public api + public string PushChangelog() + { + if (!SSHAuth()) + return null; + return LocalIsRemote() ? Commit() ?? Push() : "Can't push changelog: HEAD does not match tracked remote branch"; + } + + bool LocalIsRemote() + { + lock (RepoLock) + { + if (LoadRepo() != null) + return false; + var R = Repo.Network.Remotes["origin"]; + try + { + Commands.Fetch(Repo, R.Name, R.FetchRefSpecs.Select(X => X.Specification), null, null); + return Repo.Head.IsTracking && Repo.Head.TrackedBranch.Tip.Sha == Repo.Head.Tip.Sha; + } + catch + { + return false; + } + } + } + string Commit() { lock (RepoLock) diff --git a/TGServerService/ServerService.cs b/TGServerService/ServerService.cs index e74d43b354..65260c680d 100644 --- a/TGServerService/ServerService.cs +++ b/TGServerService/ServerService.cs @@ -75,7 +75,8 @@ namespace TGServerService ServerUpdateApplied = 6300, ChatBroadcastFail = 6400, IRCLogModes = 6500, - InteropCallException = 6600, + SubmoduleReclone = 6600, + InteropCallException = 6700, } static TGServerService ActiveService; //So everyone else can write to our eventlog diff --git a/TGServiceInterface/DreamDaemon.cs b/TGServiceInterface/DreamDaemon.cs index 1d52ca5b41..b370551c42 100644 --- a/TGServiceInterface/DreamDaemon.cs +++ b/TGServiceInterface/DreamDaemon.cs @@ -39,26 +39,7 @@ namespace TGServiceInterface /// Ultrasafe } - - /// - /// DreamDaemon's hub visibility - /// - public enum TGDreamDaemonVisibility - { - /// - /// Server will be visible on the hub - /// - Public, - /// - /// Server will not be visible on the hub to anyone but the host's friends. Since the service does not have a BYOND account, this is effectively the same as Invisible - /// - Private, - /// - /// Server will not be visible on the hub - /// - Invisible = 2, //default config - } - + /// /// Interface for managing the actual BYOND game server /// @@ -140,22 +121,6 @@ namespace TGServiceInterface [OperationContract] bool SetSecurityLevel(TGDreamDaemonSecurity level); - /// - /// Get the configured (not running) visibility level - /// - /// The configured (not running) visibility level - [OperationContract] - TGDreamDaemonVisibility VisibilityLevel(); - - /// - /// Sets the visiblity level of the server. Requires reboot to apply - /// Implies a call to RequestRestart() - /// - /// The new visibility level - /// True if the change was immediately applied, false if a graceful restart was queued - [OperationContract] - bool SetVisibility(TGDreamDaemonVisibility vis); - /// /// Get the configured port. Not necessarily the running port if it has since changed /// @@ -185,11 +150,33 @@ namespace TGServiceInterface [OperationContract] void SetAutostart(bool on); + /// + /// Check if the byond webclient is currently enabled for the server + /// + /// true if the webclient is enabled, false otherwise + [OperationContract] + bool Webclient(); + + /// + /// Set the webclient config. Calls + /// + /// true to enable the byond webclient for the server, false otherwise + [OperationContract] + void SetWebclient(bool on); + /// /// Checks if a server stop has bee requested /// /// true if RequestStop has been called since the last server start, false otherwise [OperationContract] bool ShutdownInProgress(); + + /// + /// Sends a message to everyone on the server + /// + /// The message to send + /// null on success, error message on failure + [OperationContract] + string WorldAnnounce(string msg); } } diff --git a/TGServiceInterface/Repository.cs b/TGServiceInterface/Repository.cs index f853ef1004..2e37dfc627 100644 --- a/TGServiceInterface/Repository.cs +++ b/TGServiceInterface/Repository.cs @@ -187,6 +187,13 @@ namespace TGServiceInterface [OperationContract] string GenerateChangelog(out string error); + /// + /// Pushes the changelog to the currently git, this operation will only run if the changelog is the only difference to be pushed (i.e. no PRs merged) + /// + /// null on success, error on failure + [OperationContract] + string PushChangelog(); + /// /// Sets the path to the python 2.7 installation /// diff --git a/TGServiceInterface/Server.cs b/TGServiceInterface/Server.cs index 35a0f39f31..7a110125c8 100644 --- a/TGServiceInterface/Server.cs +++ b/TGServiceInterface/Server.cs @@ -10,7 +10,7 @@ namespace TGServiceInterface /// /// List of types that can be used with GetComponen /// - public static readonly IList ValidInterfaces = new List { typeof(ITGByond), typeof(ITGChat), typeof(ITGCompiler), typeof(ITGConfig), typeof(ITGDreamDaemon), typeof(ITGRepository), typeof(ITGServerUpdater), typeof(ITGSService), typeof(ITGServiceBridge) }; + public static readonly IList ValidInterfaces = new List { typeof(ITGByond), typeof(ITGChat), typeof(ITGCompiler), typeof(ITGConfig), typeof(ITGDreamDaemon), typeof(ITGRepository), typeof(ITGSService), typeof(ITGServiceBridge) }; /// /// Base name of the communication pipe @@ -81,6 +81,7 @@ namespace TGServiceInterface [OperationContract] string Version(); } +<<<<<<< HEAD /// /// How to modify the repo during the UpdateServer operation @@ -158,4 +159,6 @@ namespace TGServiceInterface return 0; } } +======= +>>>>>>> bb1f31822a7e3adcdb8441fa765cfe8916a83adc } diff --git a/Version.cs b/Version.cs index 036fc15399..2fdd65b7fb 100644 --- a/Version.cs +++ b/Version.cs @@ -12,6 +12,6 @@ using System.Reflection; // [assembly: AssemblyVersion("1.0.*")] //It's impossible to make these a define, don't say I didn't warn you -[assembly: AssemblyVersion("3.0.89.0")] -[assembly: AssemblyFileVersion("3.0.89.0")] -[assembly: AssemblyInformationalVersion("3.0.89.0")] +[assembly: AssemblyVersion("3.0.90.2")] +[assembly: AssemblyFileVersion("3.0.90.2")] +[assembly: AssemblyInformationalVersion("3.0.90.2")]