Merge upstream

This commit is contained in:
Cyberboss
2017-10-24 16:17:46 -04:00
16 changed files with 357 additions and 510 deletions
-290
View File
@@ -1,290 +0,0 @@
using TGServiceInterface;
using System;
using System.Collections.Generic;
using System.Threading;
namespace TGServerService.ChatCommands
{
/// <summary>
/// Metadata about the currently running <see cref="ChatCommand"/>
/// </summary>
sealed class CommandInfo
{
/// <summary>
/// If the <see cref="ChatCommand"/> was invoked by an admin
/// </summary>
public bool IsAdmin { get; set; }
/// <summary>
/// If the <see cref="ChatCommand"/> was invoked from an admin chat channel
/// </summary>
public bool IsAdminChannel { get; set; }
/// <summary>
/// The name of the <see cref="ChatCommand"/> invoker
/// </summary>
public string Speaker { get; set; }
/// <summary>
/// A reference to the <see cref="ServerInstance"/> that runs the <see cref="ChatProviders.IChatProvider"/> that heard the <see cref="ChatCommand"/>
/// </summary>
public ServerInstance Server { get; set; }
}
/// <summary>
/// A command heard by a <see cref="ChatProviders.IChatProvider"/>
/// </summary>
abstract class ChatCommand : Command
{
/// <summary>
/// <see cref="CommandInfo"/> for the <see cref="ChatCommand"/>
/// </summary>
public static ThreadLocal<CommandInfo> CommandInfo { get; private set; } = new ThreadLocal<CommandInfo>();
/// <summary>
/// If set to <see langword="true"/>, the <see cref="ChatCommand"/> cannot be invoked by a non-admin or outside an admin chat channel
/// </summary>
public bool RequiresAdmin { get; protected set; }
/// <summary>
/// Shorthand for accessing <see cref="CommandInfo.Server"/>
/// </summary>
protected ServerInstance Instance { get { return CommandInfo.Value.Server; } }
/// <inheritdoc />
public override ExitCode DoRun(IList<string> parameters)
{
if (RequiresAdmin)
{
var Info = CommandInfo.Value;
if (!Info.IsAdmin)
{
OutputProc("You are not authorized to use that command!");
return ExitCode.BadCommand;
}
if (!Info.IsAdminChannel)
{
OutputProc("Use this command in an admin channel!");
return ExitCode.BadCommand;
}
}
return base.DoRun(parameters);
}
}
/// <summary>
/// <see cref="ChatCommand"/>s generated by DreamDaemon via the API
/// </summary>
sealed class ServerChatCommand : ChatCommand
{
/// <summary>
/// The help text for the <see cref="ServerChatCommand"/>
/// </summary>
readonly string HelpText;
/// <summary>
/// Construct a <see cref="ServerChatCommand"/>
/// </summary>
/// <param name="name">The invocation of the <see cref="ServerChatCommand"/></param>
/// <param name="helpText">The help text of the <see cref="ServerChatCommand"/></param>
/// <param name="adminOnly">If set to <see langword="true"/>, the <see cref="ServerChatCommand"/> cannot be invoked by a non-admin or outside an admin chat channel</param>
/// <param name="requiredParameters">The number of parameters the <see cref="ServerChatCommand"/> requires</param>
public ServerChatCommand(string name, string helpText, bool adminOnly, int requiredParameters)
{
Keyword = name;
RequiresAdmin = adminOnly;
HelpText = helpText;
RequiredParameters = requiredParameters;
}
/// <inheritdoc />
public override string GetHelpText()
{
return HelpText;
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var res = Instance.SendCommand(String.Format("{0};sender={1};custom={2}", Keyword, CommandInfo.Value.Speaker, Program.SanitizeTopicString(String.Join(" ", parameters))));
if (res != "SUCCESS" && !String.IsNullOrWhiteSpace(res))
OutputProc(res);
return ExitCode.Normal;
}
}
/// <summary>
/// The main root chat command
/// </summary>
sealed class RootChatCommand : RootCommand
{
/// <summary>
/// Construct a <see cref="RootChatCommand"/>
/// </summary>
/// <param name="serverCommands">List of <see cref="ServerChatCommand"/>s supplied by DreamDaemon</param>
public RootChatCommand(List<Command> serverCommands)
{
var tmp = new List<Command> { new PRsCommand(), new VersionCommand(), new RevisionCommand(), new ByondCommand(), new KekCommand() };
if (serverCommands != null)
tmp.AddRange(serverCommands);
Children = tmp.ToArray();
serverCommands = new List<Command>();
PrintHelpList = true;
}
}
/// <summary>
/// Retrieves the git SHA of the live DreamDaemon code
/// </summary>
sealed class RevisionCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="RevisionCommand"/>
/// </summary>
public RevisionCommand()
{
Keyword = "revision";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var res = Instance.LiveSha();
if (res == "UNKNOWN") {
OutputProc(res);
return ExitCode.ServerError;
}
OutputProc(String.Format("^{0}", res));
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Prints the current code revision of the repository (not the server)";
}
}
/// <summary>
/// Retrieve the installed, staged, or latest availab
/// </summary>
sealed class ByondCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="ByondCommand"/>
/// </summary>
public ByondCommand()
{
Keyword = "byond";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var type = ByondVersion.Installed;
if (parameters.Count > 0)
if (parameters[0].ToLower() == "--staged")
type = ByondVersion.Staged;
else if (parameters[0].ToLower() == "--latest")
type = ByondVersion.Latest;
OutputProc(Instance.GetVersion(type) ?? "None");
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the specified BYOND version";
}
/// <inheritdoc />
public override string GetArgumentString()
{
return "[--staged|--latest]";
}
}
/// <summary>
/// Retrieve the current service version
/// </summary>
sealed class VersionCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="VersionCommand"/>
/// </summary>
public VersionCommand()
{
Keyword = "version";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
OutputProc(Instance.Version());
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the running service version";
}
}
/// <summary>
/// kek
/// </summary>
sealed class KekCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="KekCommand"/>
/// </summary>
public KekCommand()
{
Keyword = "kek";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
OutputProc("kek");
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "kek";
}
}
/// <summary>
/// Retrieve the list of test-merged github pull requests
/// </summary>
sealed class PRsCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="PRsCommand"/>
/// </summary>
public PRsCommand()
{
Keyword = "prs";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var PRs = Instance.MergedPullRequests(out string res);
if (PRs == null)
{
OutputProc(res);
return ExitCode.ServerError;
}
if (PRs.Count == 0)
OutputProc("None!");
else
{
res = "";
foreach (var I in PRs)
res += "#" + I.Number + " ";
OutputProc(res);
}
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the currently merged pull requests in the repository";
}
}
}
@@ -0,0 +1,44 @@
using System.Collections.Generic;
using TGServiceInterface;
namespace TGServerService.ChatCommands
{
/// <summary>
/// Retrieve the installed, staged, or latest availab
/// </summary>
sealed class ByondCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="ByondCommand"/>
/// </summary>
public ByondCommand()
{
Keyword = "byond";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var type = ByondVersion.Installed;
if (parameters.Count > 0)
if (parameters[0].ToLower() == "--staged")
type = ByondVersion.Staged;
else if (parameters[0].ToLower() == "--latest")
type = ByondVersion.Latest;
OutputProc(Instance.GetVersion(type) ?? "None");
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the specified BYOND version";
}
/// <inheritdoc />
public override string GetArgumentString()
{
return "[--staged|--latest]";
}
}
}
@@ -0,0 +1,45 @@
using System.Collections.Generic;
using System.Threading;
using TGServiceInterface;
namespace TGServerService.ChatCommands
{
/// <summary>
/// A command heard by a <see cref="ChatProviders.IChatProvider"/>
/// </summary>
abstract class ChatCommand : Command
{
/// <summary>
/// <see cref="CommandInfo"/> for the <see cref="ChatCommand"/>
/// </summary>
public static ThreadLocal<CommandInfo> CommandInfo { get; private set; } = new ThreadLocal<CommandInfo>();
/// <summary>
/// If set to <see langword="true"/>, the <see cref="ChatCommand"/> cannot be invoked by a non-admin or outside an admin chat channel
/// </summary>
public bool RequiresAdmin { get; protected set; }
/// <summary>
/// Shorthand for accessing <see cref="CommandInfo.Server"/>
/// </summary>
protected ServerInstance Instance { get { return CommandInfo.Value.Server; } }
/// <inheritdoc />
public override ExitCode DoRun(IList<string> parameters)
{
if (RequiresAdmin)
{
var Info = CommandInfo.Value;
if (!Info.IsAdmin)
{
OutputProc("You are not authorized to use that command!");
return ExitCode.BadCommand;
}
if (!Info.IsAdminChannel)
{
OutputProc("Use this command in an admin channel!");
return ExitCode.BadCommand;
}
}
return base.DoRun(parameters);
}
}
}
@@ -0,0 +1,25 @@
namespace TGServerService.ChatCommands
{
/// <summary>
/// Metadata about the currently running <see cref="ChatCommand"/>
/// </summary>
sealed class CommandInfo
{
/// <summary>
/// If the <see cref="ChatCommand"/> was invoked by an admin
/// </summary>
public bool IsAdmin { get; set; }
/// <summary>
/// If the <see cref="ChatCommand"/> was invoked from an admin chat channel
/// </summary>
public bool IsAdminChannel { get; set; }
/// <summary>
/// The name of the <see cref="ChatCommand"/> invoker
/// </summary>
public string Speaker { get; set; }
/// <summary>
/// A reference to the <see cref="ServerInstance"/> that runs the <see cref="ChatProviders.IChatProvider"/> that heard the <see cref="ChatCommand"/>
/// </summary>
public ServerInstance Server { get; set; }
}
}
@@ -0,0 +1,31 @@
using System.Collections.Generic;
namespace TGServerService.ChatCommands
{
/// <summary>
/// kek
/// </summary>
sealed class KekCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="KekCommand"/>
/// </summary>
public KekCommand()
{
Keyword = "kek";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
OutputProc("kek");
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "kek";
}
}
}
@@ -0,0 +1,45 @@
using System.Collections.Generic;
namespace TGServerService.ChatCommands
{
/// <summary>
/// Retrieve the list of test-merged github pull requests
/// </summary>
sealed class PullRequestsCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="PullRequestsCommand"/>
/// </summary>
public PullRequestsCommand()
{
Keyword = "prs";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var PRs = Instance.MergedPullRequests(out string res);
if (PRs == null)
{
OutputProc(res);
return ExitCode.ServerError;
}
if (PRs.Count == 0)
OutputProc("None!");
else
{
res = "";
foreach (var I in PRs)
res += "#" + I.Number + " ";
OutputProc(res);
}
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the currently merged pull requests in the repository";
}
}
}
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
namespace TGServerService.ChatCommands
{
/// <summary>
/// Retrieves the git SHA of the live DreamDaemon code
/// </summary>
sealed class RevisionCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="RevisionCommand"/>
/// </summary>
public RevisionCommand()
{
Keyword = "revision";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var res = Instance.LiveSha();
if (res == "UNKNOWN")
{
OutputProc(res);
return ExitCode.ServerError;
}
OutputProc(String.Format("^{0}", res));
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Prints the current code revision of the repository (not the server)";
}
}
}
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using TGServiceInterface;
namespace TGServerService.ChatCommands
{
/// <summary>
/// The main root chat command
/// </summary>
sealed class RootChatCommand : RootCommand
{
/// <summary>
/// Construct a <see cref="RootChatCommand"/>
/// </summary>
/// <param name="serverCommands">List of <see cref="ServerChatCommand"/>s supplied by DreamDaemon</param>
public RootChatCommand(List<Command> serverCommands)
{
var tmp = new List<Command> { new PullRequestsCommand(), new VersionCommand(), new RevisionCommand(), new ByondCommand(), new KekCommand() };
if (serverCommands != null)
tmp.AddRange(serverCommands);
Children = tmp.ToArray();
serverCommands = new List<Command>();
PrintHelpList = true;
}
}
}
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
namespace TGServerService.ChatCommands
{
/// <summary>
/// <see cref="ChatCommand"/>s generated by DreamDaemon via the API
/// </summary>
sealed class ServerChatCommand : ChatCommand
{
/// <summary>
/// The help text for the <see cref="ServerChatCommand"/>
/// </summary>
readonly string HelpText;
/// <summary>
/// Construct a <see cref="ServerChatCommand"/>
/// </summary>
/// <param name="name">The invocation of the <see cref="ServerChatCommand"/></param>
/// <param name="helpText">The help text of the <see cref="ServerChatCommand"/></param>
/// <param name="adminOnly">If set to <see langword="true"/>, the <see cref="ServerChatCommand"/> cannot be invoked by a non-admin or outside an admin chat channel</param>
/// <param name="requiredParameters">The number of parameters the <see cref="ServerChatCommand"/> requires</param>
public ServerChatCommand(string name, string helpText, bool adminOnly, int requiredParameters)
{
Keyword = name;
RequiresAdmin = adminOnly;
HelpText = helpText;
RequiredParameters = requiredParameters;
}
/// <inheritdoc />
public override string GetHelpText()
{
return HelpText;
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
var res = Instance.SendCommand(String.Format("{0};sender={1};custom={2}", Keyword, CommandInfo.Value.Speaker, Program.SanitizeTopicString(String.Join(" ", parameters))));
if (res != "SUCCESS" && !String.IsNullOrWhiteSpace(res))
OutputProc(res);
return ExitCode.Normal;
}
}
}
@@ -0,0 +1,31 @@
using System.Collections.Generic;
namespace TGServerService.ChatCommands
{
/// <summary>
/// Retrieve the current service version
/// </summary>
sealed class VersionCommand : ChatCommand
{
/// <summary>
/// Construct a <see cref="VersionCommand"/>
/// </summary>
public VersionCommand()
{
Keyword = "version";
}
/// <inheritdoc />
protected override ExitCode Run(IList<string> parameters)
{
OutputProc(Instance.Version());
return ExitCode.Normal;
}
/// <inheritdoc />
public override string GetHelpText()
{
return "Gets the running service version";
}
}
}
-12
View File
@@ -1,12 +0,0 @@
RepoLock protects the repo for the full duration of short operations
RepoBusy protects the repo for long operations
lock RepoLock and check RepoBusy to see if you can use the repo
configLock is only for atomically reading and writing the config directory
compilerLock protects the compilerCurrentStatus and lastCompilerError vars
byondLock protects the updateStat and lastError vars
watchdogLock protects the currentStatus var
-66
View File
@@ -1,66 +0,0 @@
namespace TGServerService
{
public partial class ProjectInstaller
{
/// <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.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller1
//
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
//
// serviceInstaller1
//
this.serviceInstaller1.Description = "/tg/station Server Service";
this.serviceInstaller1.DisplayName = "TG Station Server";
this.serviceInstaller1.ServiceName = "TG Station Server";
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new System.Configuration.Install.Installer[] {
this.serviceProcessInstaller1,
this.serviceInstaller1});
}
#endregion
/// <summary>
/// The project's <see cref="System.ServiceProcess.ServiceProcessInstaller"/>
/// </summary>
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
/// <summary>
/// The project's <see cref="System.ServiceProcess.ServiceInstaller"/>
/// </summary>
private System.ServiceProcess.ServiceInstaller serviceInstaller1;
}
}
+17 -2
View File
@@ -1,10 +1,11 @@
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace TGServerService
{
/// <summary>
/// This tells the .msi there is a Windows <see cref="System.ServiceProcess.ServiceBase"/> in this <see cref="System.Reflection.Assembly"/> that needs installation
/// This tells the .msi there is a Windows <see cref="ServiceBase"/> in this <see cref="System.Reflection.Assembly"/> that needs installation
/// </summary>
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
@@ -14,7 +15,21 @@ namespace TGServerService
/// </summary>
public ProjectInstaller()
{
InitializeComponent();
Installers.AddRange(new Installer[] {
new ServiceProcessInstaller
{
Account = ServiceAccount.LocalSystem,
Password = null,
Username = null
},
new ServiceInstaller
{
Description = "/tg/station Server Service",
DisplayName = "TG Station Server",
ServiceName = "TG Station Server",
StartType = ServiceStartMode.Automatic
}
});
}
}
}
-129
View File
@@ -1,129 +0,0 @@
<?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>
<metadata name="serviceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
</metadata>
<metadata name="serviceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>196, 17</value>
</metadata>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>
+1 -1
View File
@@ -103,8 +103,8 @@ namespace TGServerService
Config.UpgradeRequired = false;
Config.Save();
}
ActiveService = this;
ServiceName = "TG Station Server";
ActiveService = this;
Run(this);
}
finally
+10 -10
View File
@@ -82,6 +82,15 @@
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="ChatCommands\ByondCommand.cs" />
<Compile Include="ChatCommands\CommandInfo.cs" />
<Compile Include="ChatCommands\ChatCommand.cs" />
<Compile Include="ChatCommands\KekCommand.cs" />
<Compile Include="ChatCommands\PullRequestsCommand.cs" />
<Compile Include="ChatCommands\RevisionCommand.cs" />
<Compile Include="ChatCommands\RootChatCommand.cs" />
<Compile Include="ChatCommands\ServerChatCommand.cs" />
<Compile Include="ChatCommands\VersionCommand.cs" />
<Compile Include="AdministrativeAuthorizationManager.cs" />
<Compile Include="DeprecatedInstanceConfig.cs" />
<Compile Include="InstanceConfig.cs" />
@@ -90,7 +99,6 @@
<Compile Include="ServerInstance\Administration.cs" />
<Compile Include="ServerInstance\Byond.cs" />
<Compile Include="ServerInstance\Chat.cs" />
<Compile Include="ChatCommands.cs" />
<Compile Include="ChatProviders\ChatProvider.cs" />
<Compile Include="ServerInstance\Compiler.cs" />
<Compile Include="ServerInstance\Config.cs" />
@@ -111,9 +119,6 @@
<Compile Include="ProjectInstaller.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="ProjectInstaller.Designer.cs">
<DependentUpon>ProjectInstaller.cs</DependentUpon>
</Compile>
<Compile Include="Service.cs">
<SubType>Component</SubType>
</Compile>
@@ -133,11 +138,6 @@
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ProjectInstaller.resx">
<DependentUpon>ProjectInstaller.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TGServiceInterface\TGServiceInterface.csproj">
<Project>{ac4e7e8b-f83a-481c-a8b0-8fa4e8ae59ab}</Project>
@@ -145,9 +145,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="LockDependancies.txt" />
<Content Include="tgs.ico" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>