diff --git a/src/Tgstation.Server.Host/.xml b/src/Tgstation.Server.Host/.xml
new file mode 100644
index 0000000000..3a30704774
--- /dev/null
+++ b/src/Tgstation.Server.Host/.xml
@@ -0,0 +1,8470 @@
+
+
+
+ Tgstation.Server.Host
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ The path to the BYOND bin folder
+
+
+
+
+ The file in which we store the for installations
+
+
+
+
+ The file in which we store the for the active installation
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Map of byond s to s that complete when they are installed
+
+
+
+
+ The for the
+
+
+
+
+ Converts a BYOND to a
+
+ The to convert
+ The representation of
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ Installs a BYOND if it isn't already
+
+ The BYOND to install
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents usage of the two primary BYOND server executables
+
+
+
+
+ The of the locked executables
+
+
+
+
+ The path to the DreamDaemon executable
+
+
+
+
+ The path to the dm/DreamMaker executable
+
+
+
+
+ Call if, during a detach, this version should not be deleted
+
+
+
+
+ For downloading and installing BYOND extractions for a given system
+
+
+
+
+ Get the file name of the DreamDaemon executable
+
+
+
+
+ Get the file name of the DreamMaker executable
+
+
+
+
+ Download a given BYOND
+
+ The of BYOND to download
+ The for the operation
+ A resulting in the s of the zipfile
+
+
+
+ Does actions necessary to get an extracted BYOND installation working
+
+ The path to the BYOND installation
+ The of BYOND being installed
+ The for the operation
+
+
+
+
+ Attempts to cleans the BYOND cache folder for the system
+
+ The for the operation
+ A representing the running operation
+
+
+
+ For managing the BYOND installation
+
+
+
+
+ The currently active BYOND version
+
+
+
+
+ The installed BYOND versions
+
+
+
+
+ Change the active BYOND version
+
+ The new
+ The for the operation
+
+
+
+ Lock the current installation's location and return a
+
+ The BYOND required
+ The for the operation
+ A resulting in the requested
+
+
+
+ for Posix systems
+
+
+
+
+ The URL format string for getting BYOND linux version {0}.{1} zipfile
+
+
+
+
+ Path to the BYOND cache
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ for windows systems
+
+
+
+
+ The URL format string for getting BYOND windows version {0}.{1} zipfile
+
+
+
+
+ Directory to byond installation configuration
+
+
+
+
+ BYOND's DreamDaemon config file
+
+
+
+
+ Setting to add to to suppress an invisible user prompt for running a trusted mode .dmb
+
+
+
+
+ The directory that contains the BYOND directx redistributable
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ If DirectX was installed
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a channel
+
+
+
+
+ Backing field for . Represented as a to avoid BYOND percision loss
+
+
+
+
+ The channel Id.
+
+ remaps this to an internal id using
+
+
+
+ The user friendly name of the
+
+
+
+
+ The name of the connection the belongs to
+
+
+
+
+ If this is considered a channel for admin commands
+
+
+
+
+ If this is a 1-to-1 chat channel
+
+
+
+
+ For user use
+
+
+
+
+ Represents a mapping of a
+
+
+
+
+ The Id of the
+
+
+
+
+ The original
+
+
+
+
+ If is a watchdog channel
+
+
+
+
+ If the is an updates channel
+
+
+
+
+ The with the mapped Id
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Unchanging s in the mapped by
+
+
+
+
+ Map of s in use, keyed by
+
+
+
+
+ Map of s to s
+
+
+
+
+ The active s for the
+
+
+
+
+ The for
+
+
+
+
+ The initial for the
+
+
+
+
+ The for the
+
+
+
+
+ The that monitors incoming chat messages
+
+
+
+
+ The that completes when s change
+
+
+
+
+ Used for remapping s
+
+
+
+
+ If has been called
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The to populate with
+ The value of
+ The value of
+ The value of
+ The used to populate
+
+
+
+
+
+
+ Remove a from and optionally updating the as well
+
+ The of the to delete
+ If should be update
+ The for the operation
+ A resulting in the being removed if it exists, otherwise
+
+
+
+ Processes a
+
+ The who recevied
+ The to process
+ The for the operation
+ A representing the running operation
+
+
+
+ Monitors active providers for new s
+
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ for decoding bools returned by BYOND
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For displaying the installed Byond version
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+ Set a for the
+
+ The to set
+
+
+
+
+
+
+ Represents a command made from DM code
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Set a new
+
+ The value of
+
+
+
+
+
+
+ Represents a command that can be invoked by talking to chat bots
+
+
+
+
+ The text to invoke the command. May not be "?" or "help" (case-insensitive)
+
+
+
+
+ The help text to display when queires are made about the command
+
+
+
+
+ If the command should only be available to s who's has set
+
+
+
+
+ Invoke the
+
+ The text after with leading whitespace trimmed
+ The who invoked the command
+ The for the operation
+ A resulting in a to send to the invoker
+
+
+
+ Factory for built in s
+
+
+
+
+ Generate builtin s
+
+ A of s
+
+
+
+ kek
+
+
+
+
+ kek
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Command for reading the active s
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ For displaying
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ to return the
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+
+
+
+
+
+
+
+ For managing connected chat services
+
+
+
+
+ If a given set of is connected
+
+ The of the connection
+ if it is connected, otherwise
+
+
+
+ Registers a to use
+
+ A
+
+
+
+ Change chat settings. If the is not currently in use, a new connection will be made instead
+
+ The new
+ The for the operation
+ A representing the running operation. Will complete immediately if the property of is
+
+
+
+ Disconnects and deletes a given connection
+
+ The of the connection
+ The for the operation
+ A representing the running operation
+
+
+
+ Change chat channels
+
+ The of the connection
+ An of the new list of s
+ The for the operation
+ A representing the running operation
+
+
+
+ Send a chat to a given set of
+
+ The message being sent
+ The s of the s to send to
+ The for the operation
+ A representing the running operation
+
+
+
+ Send a chat to configured watchdog channels
+
+ The message being sent
+ The for the operation
+ A representing the running operation
+
+
+
+ Send a chat to configured update channels
+
+ The message being sent
+ The for the operation
+ A representing the running operation
+
+
+
+ Start tracking json files for commands and channels
+
+ The base path of the .jsons
+ The name of the chat channels json
+ The name of the chat commands json
+ The for the operation
+ A resulting in a tied to the lifetime of the json trackings
+
+
+
+ For creating s
+
+
+
+
+ Create a
+
+ The for the
+ The for the
+ The initial for the
+ A new
+
+
+
+ Handles s that map to those defined in a
+
+
+
+
+ Handle a chat command
+
+ The command name
+ Everything typed after minus leading spaces
+ The sending
+ The for the operation
+ A resulting in the response text to send back
+
+
+
+ Represents a tracking of dynamic chat json files
+
+
+
+
+ If the should be used for
+
+
+
+
+ Read s from the
+
+ The for the operation
+ A resulting in a of s in the
+
+
+
+ Writes information about connected to the
+
+ The s to write out
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for s
+
+
+
+
+ Create a
+
+ The containing settings for the new provider
+ A new
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a message recieved by a
+
+
+
+
+ The text of the message
+
+
+
+
+ The who sent the
+
+
+
+
+ for the Discord app
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The token used for connecting to discord
+
+
+
+
+ of mapped s
+
+
+
+
+ Normalize a discord mention string
+
+ The mention provided by the Discord library
+ The normalized mention
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+ Handle a message recieved from Discord
+
+ The
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For interacting with a chat service
+
+
+
+
+ If the
+
+
+
+
+ The that indicates the was mentioned
+
+
+
+
+ Get a resulting in the next the recieves or on a disconnect
+
+ The for the operation
+ A resulting in the next available
+ Note that private messages will come in the form of s not returned in
+
+
+
+ Attempt to connect the
+
+ The for the operation
+ A resulting in on success, otherwise
+
+
+
+ Gracefully disconnects the provider. Implies a call to
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Get the s for given
+
+ The s to map
+ The for the operation
+ A resulting in a of the s representing
+
+
+
+ Send a message to the
+
+ The to send to
+ The message contents
+ The for the operation
+ A representing the running operation
+
+
+
+ for internet relay chat
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The client
+
+
+
+
+ Address of the server to connect to
+
+
+
+
+ Port of the server to connect to
+
+
+
+
+ IRC nickname
+
+
+
+
+ Password which will used for authentication
+
+
+
+
+ The of
+
+
+
+
+ Map of s to channel names
+
+
+
+
+ Map of s to query users
+
+
+
+
+ Id counter for
+
+
+
+
+ The used for
+
+
+
+
+ If we are disconnecting
+
+
+
+
+ Construct an
+
+ The to get the from
+ The value of
+ The value of logger
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ If should be used
+
+
+
+
+
+
+ Handle an IRC message
+
+ The
+ If this is a query message
+
+
+
+ When a query message is received in IRC
+
+ The sender of the event
+ The
+
+
+
+ When a channel message is received in IRC
+
+ The sender of the event
+ The
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ of received s
+
+
+
+
+ that completes while isn't empty
+
+
+
+
+ Construct a
+
+
+
+
+
+
+
+
+
+
+ Queues a for
+
+ The to queue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ Represents a chat message requested by DD
+
+
+
+
+ The message string
+
+
+
+
+ The list of internal channel ids to send to
+
+
+
+
+ Represents a tgs_chat_user datum
+
+
+
+
+ Backing field for . Represented as a to avoid BYOND percision loss
+
+
+
+
+ The internal user id
+
+
+
+
+ The friendly name of the user
+
+
+
+
+ The text to mention the user
+
+
+
+
+ The the user spoke from
+
+
+
+
+ Standard
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for
+
+
+
+
+ representing calls to
+
+
+
+
+ resulting in the latest yet to exist
+
+
+
+
+ The latest
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ Delete the of
+
+ The to clean
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The to run when is called
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ Name of the primary directory used for compilation
+
+
+
+
+ Name of the secondary directory used for compilation
+
+
+
+
+ Extension for .dmbs
+
+
+
+
+ Extension for .dmes
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ If a compile job is running
+
+
+
+
+ Construct
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+ Run a quick DD instance to test the DMAPI is installed on the target code
+
+ The timeout in seconds for validation
+ The level to use to validate the API
+ The for the operation
+ The current
+ The port to use for API validation
+ The for the operation
+ A representing the running operation
+
+
+
+ Compiles a .dme with DreamMaker
+
+ The path to the DreamMaker executable
+ The for the operation
+ The for the operation
+ A representing the running operation
+
+
+
+ Adds server side includes to the .dme being compiled
+
+ The for the operation
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+ Sink for s
+
+
+
+
+ Load a new into the
+
+ The to load
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for s
+
+
+
+
+ Get a that completes when the result of a call to will be different than the previous call if any
+
+ A representing the running operation
+
+
+
+ If will succeed
+
+
+
+
+ Gets the next
+
+ The amount of locks to give the resulting . It's must be called this many times to properly clean the job
+ A new
+
+
+
+ Gets a for a given
+
+ The to make the for
+ The for the operation
+ A resulting in a new representing the on success, on failure
+
+
+
+ Deletes all compile jobs that are inactive in the Game folder
+
+ An optional compile job to not delete
+ The for the operation
+ A representing the running operation
+
+
+
+ For managing the compiler
+
+
+
+
+ Starts a compile
+
+ The being compiled from the
+ The for the compile
+ The time in seconds to wait while validating the API
+ The to copy from
+ The to report compilation progress
+ The estimated amount of time the compile will take
+ The for the operation
+ A resulting in the partially populated for the operation. In particular, note the field will only have it's field populated
+
+
+
+ Temporary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct an
+
+ The value of
+
+
+
+
+
+
+ Set the for the
+
+ The value of
+
+
+
+ Types of events. Mirror in tgs.dm
+
+
+
+
+ Parameters: Reference name, commit sha
+
+
+
+
+ Parameters: Checkout target
+
+
+
+
+ No parameters
+
+
+
+
+ Parameters: Pull request number, pull request sha, merger message
+
+
+
+
+ Parameters: Absolute path to repository root
+
+
+
+
+ Parameters: Version being installed
+
+
+
+
+ Parameters: Error string
+
+
+
+
+ Parameters: Old active version, new active version
+
+
+
+
+ Parameters: Game directory path, origin commit sha
+
+
+
+
+ No parameters
+
+
+
+
+ Parameters: Game directory path, "1" if compile succeeded and api validation failed, "0" otherwise
+
+
+
+
+ Parameters: Game directory path
+
+
+
+
+ No parameters
+
+
+
+
+ Parameters: Base sha, target sha, base reference, target reference
+
+
+
+
+ Provides absolute paths to the latest compiled .dmbs
+
+
+
+
+ The file name of the .dmb
+
+
+
+
+ The primary game directory with a trailing directory separator
+
+
+
+
+ The secondary game directory with a trailing directory separator
+
+
+
+
+ The of the .dmb
+
+
+
+
+ Disposing the won't cause a cleanup of the working directory
+
+
+
+
+ Consumes s and takes the appropriate actions
+
+
+
+
+ Handle a given
+
+ The
+ The parameters for
+ The for the operation
+ A resulting in if more should run, otherwise
+
+
+
+ For interacting with the instance services
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The latest staged
+
+ The latest if it exists
+
+
+
+ Rename the
+
+ The new name for the
+
+
+
+ Change the for the
+
+ The new auto update inteval
+ A representing the running operation
+
+
+
+ Run the compile job and insert it into the database. Meant to be called by a
+
+ The running
+ The for the operation
+ The to report compilation progress
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for creating s
+
+
+
+
+ Create an
+
+ The
+ A new
+
+
+
+ For managing s
+
+
+
+
+ Get the associated with given
+
+ The of the desired
+ The associated with the given
+
+
+
+ Online an
+
+ The of the desired
+ The for the operation
+ A representing the running operation
+
+
+
+ Offline an
+
+ The of the desired
+ The performing the operation
+ The for the operation
+ A representing the running operation
+
+
+
+ Move an
+
+ The of the desired
+ The new path of the . will have this set on if the operation completes successfully
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The auto update
+
+
+
+
+ for
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+ Pull the repository and compile for every set of given
+
+ How many minutes the operation should repeat. Does not include running time
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Map of s to respective s
+
+
+
+
+ Used in to determine if database downgrades must be made
+
+
+
+
+ If the has been d
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The used to register the as a
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a chat command to be handled by DD
+
+
+
+
+ The command name
+
+
+
+
+ The command params
+
+
+
+
+ The that sent the command
+
+
+
+
+ Represents a command from DD
+
+
+
+
+ The dictionary of the
+
+
+
+
+ The raw JSON of the
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ If the has been disposed
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The path to watch
+ The filter to watch for
+
+
+
+
+
+
+ Runs when the triggers
+
+ The sender of the event
+ The
+
+
+
+
+
+
+ Constants used for communication with the DMAPI
+
+
+
+
+ Identifies a TGS execution. The server version
+
+
+
+
+ Path to the
+
+
+
+
+ The
+
+
+
+
+ Generic OK response
+
+
+
+
+ Change port
+
+
+
+
+ Change reboot mode
+
+
+
+
+ Chat command
+
+
+
+
+ Notify of an
+
+
+
+
+ Response to an interop export from DM
+
+
+
+
+ Set port command
+
+
+
+
+ API validation command
+
+
+
+
+ Server primed command
+
+
+
+
+ World reboot command
+
+
+
+
+ Terminate process command
+
+
+
+
+ Chat send command
+
+
+
+
+ Topic command parameter
+
+
+
+
+ Command data
+
+
+
+
+ For notifying DD of s
+
+
+
+
+ The
+
+
+
+
+ The event parameters
+
+
+
+
+ Represents a registration of an interop session
+
+
+
+
+ Register a with the
+
+ The to register
+
+
+
+ Handles s
+
+
+
+
+ Handle a
+
+ The to handle
+ The for the operation
+ A representing the running operation
+
+
+
+ Representation of the initial json passed to DreamDaemon
+
+
+
+
+ The code used by the server to authenticate command Topics
+
+
+
+
+ If DD should just respond if it's API is working and then exit
+
+
+
+
+ The of the owner at the time of launch
+
+
+
+
+ JSON file name that contains current active chat channel information
+
+
+
+
+ JSON file DD should write to with available chat commands
+
+
+
+
+ JSON file DD should write to to send commands to the server
+
+
+
+
+ The of the launch
+
+
+
+
+ The level of the launch
+
+
+
+
+ The s in the launch
+
+
+
+
+ Information used in for reattaching and interop
+
+
+
+
+ Path to the chat commands json file
+
+
+
+
+ Path to the chat channels json file
+
+
+
+
+ Path to the server commands json file
+
+
+
+
+ Construct an
+
+
+
+
+ Construct an from a
+
+ An to copy
+
+
+
+ This model mirrors /datum/tgs_revision_information/test_merge
+
+
+
+
+ The unix time of when the test merge was applied
+
+
+
+
+ The of the
+
+
+
+
+ Construct a
+
+ The to build from
+ The value of
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+
+
+
+ For generating s
+
+
+
+
+ Generate a from a given and
+
+ The optional username to use in the
+ The optional password to use in the
+ A new
+
+
+
+ Represents an on-disk git repository
+
+
+
+
+ If the was cloned from GitHub.com
+
+
+
+
+ The if this
+
+
+
+
+ The if this
+
+
+
+
+ If tracks an upstream branch
+
+
+
+
+ The SHA of the HEAD
+
+
+
+
+ The current reference the HEAD is using. This can be a branch or tag
+
+
+
+
+ The current origin remote the is using
+
+
+
+
+ Checks if a given is a sha
+
+ The git object to check
+ The for the operation
+ A resulting in if is a sha, otherwise
+
+
+
+ Checks out a given
+
+ The sha or reference to checkout
+ to report 0-100 progress of the operation
+ The for the operation
+ A representing the running operation
+
+
+
+ Attempt to merge a GitHub pull request into HEAD
+
+ The of the pull request
+ The name of the merge committer
+ The e-mail of the merge committer
+ The username to fetch from the origin repository
+ The password to fetch from the origin repository
+ to report 0-100 progress of the operation
+ The for the operation
+ A resulting in a representing the merge result that is after a fast forward or up to date, on a non-fast-forward, on a conflict
+
+
+
+ Fetch commits from the origin repository
+
+ The username to fetch from the origin repository
+ The password to fetch from the origin repository
+ to report 0-100 progress of the operation
+ The for the operation
+ A representing the running operation
+
+
+
+ Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on the origin repository
+
+ to report 0-100 progress of the operation
+ The for the operation
+ A resulting in the SHA of the new HEAD
+
+
+
+ Requires the current HEAD to be a reference. Hard resets the reference to the given sha
+
+ The sha hash to reset to
+ to report 0-100 progress of the operation
+ The for the operation
+ A resulting in the SHA of the new HEAD
+
+
+
+ Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the origin repository
+
+ The name of the merge committer
+ The e-mail of the merge committer
+ to report 0-100 progress of the operation
+ The for the operation
+ A resulting in a representing the merge result that is after a fast forward, on a merge or up to date, on a conflict
+
+
+
+ Runs the synchronize event script and attempts to push any changes made to the if on a tracked branch
+
+ The username to fetch from the origin repository
+ The password to fetch from the origin repository
+ The name of the potential committer
+ The e-mail of the potential committer
+ to report 0-100 progress of the operation
+ If the synchronizations should be made to the tracked reference as opposed to a temporary branch
+ The for the operation
+ A resulting in if commits were pushed to the tracked origin reference, otherwise
+
+
+
+ Copies the current working directory to a given
+
+ The path to copy repository contents to
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for creating and loading s
+
+
+
+
+ If something is holding a lock on the repository
+
+
+
+
+ If a operation is in progress
+
+
+
+
+ Attempt to load the from the default location
+
+ The for the operation
+ The loaded if it exists, otherwise
+
+
+
+ Clone the repository at
+
+ The of the remote repository to clone
+ The branch to clone
+ The username to clone from
+ The password to clone from
+ A function to report 0-100 progress of the clone
+ The for the operation
+ The newly cloned , if one already exists
+
+
+
+ Delete the current repository
+
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+ Indication of a GitHub repository
+
+
+
+
+ Template error message for when tracking of the most recent origin commit fails
+
+
+
+
+ The branch name used for publishing testmerge commits
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ to be taken when is called
+
+
+
+
+ Converts a given to a
+
+ to report 0-100 progress of the operation
+ A based on
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value if
+
+
+
+
+
+
+ Generate a standard set of
+
+ to report 0-100 progress of the operation
+ The username for the
+ The password for the
+ The for the operation
+ A new set of
+
+
+
+ Runs a blocking force checkout to
+
+ The committish to checkout
+ Progress reporter
+ The for the operation
+
+
+
+
+
+
+
+
+
+
+
+
+ Force push the current repository HEAD to ;
+
+ The username to fetch from the origin repository
+ The password to fetch from the origin repository
+ to report 0-100 progress of the operation
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The created s
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Used for controlling single access to the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name of the ignore file in
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ The for
+
+
+
+
+ Construct
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ Get the proper path to
+
+ The relative path to
+
+
+
+ Ensures standard configuration directories exist
+
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For managing the Configuration directory
+
+
+
+
+ Copies all files in the CodeModifications directory to
+
+ The .dme file being compiled
+ Path to the destination folder
+ The for the operation
+ A resulting in the if any
+
+
+
+ Symlinks all directories in the GameData directory to
+
+ Path to the destination folder
+ The for the operation
+ A representing the running operation
+
+
+
+ Get for all items in a given
+
+ The relative path in the Configuration directory
+ The for the operation. If , the operation will be performed as the user of the
+ The for the operation
+ A resulting in the s for the items in the directory. and will both be
+
+
+
+ Reads a given
+
+ The relative path in the Configuration directory
+ The for the operation. If , the operation will be performed as the user of the
+ The for the operation
+ A resulting in the of the file
+
+
+
+ Create an empty directory at
+
+ The relative path in the Configuration directory
+ The for the operation. If , the operation will be performed as the user of the
+ The for the operation. Usage may result in partial writes
+ A resulting in if the directory already existed, otherwise
+
+
+
+ Attempt to delete an empty directory at
+
+ The path of the empty directory to delete
+ The for the operation. If , the operation will be performed as the user of the
+ The for the operation
+ if the directory was empty and deleted, otherwise
+
+
+
+ Writes to a given
+
+ The relative path in the Configuration directory
+ The for the operation. If , the operation will be performed as the user of the
+ The data to write. If , the file is deleted
+ The hash any existing file must match in order for the write to succeed
+ The for the operation. Usage may result in partial writes
+ A resulting in the updated or if the write failed due to conflicts
+
+
+
+ Represents code modifications via configuration
+
+
+
+
+ If the target dme was completely overwitten
+
+
+
+
+ The #include line which should be added to the beginning of the .dme if any
+
+
+
+
+ The #include line which should be added to the end of the .dme if any
+
+
+
+
+ Construct
+
+ The value of
+ The value of
+ The value of
+
+
+
+ Status of DMAPI validation
+
+
+
+
+ The DMAPI never contacted the server for validation
+
+
+
+
+ The server was contacted for validation but it was never requested
+
+
+
+
+ The validation request was malformed
+
+
+
+
+ Valid API. The game must be run with a minimum security level of
+
+
+
+
+ Valid API. The game must be run with a security level of
+
+
+
+
+ Valid API. The game must be run with a minimum security level of
+
+
+
+
+ Implements a fake "dead"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ If the was d
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
+
+
+
+
+ Register a given for network prompt reaping
+
+ The to register
+
+
+
+ Handles saving and loading
+
+
+
+
+ Save some
+
+ The to save
+ The for the operation
+ A representing the running operation
+
+
+
+ Load a saved
+
+ The for the operation
+ A resulting in the stored if any
+
+
+
+ Handles communication with a DreamDaemon
+
+
+
+
+ A that completes when DreamDaemon starts pumping the windows message queue after loading a .dmb or when it crashes
+
+
+
+
+ If the of is being used
+
+
+
+
+ If the DreamDaemon instance sent a
+
+
+
+
+ The DMAPI
+
+
+
+
+ The being used
+
+
+
+
+ The current port DreamDaemon is listening on
+
+
+
+
+ If the port should be rotated off when the world reboots
+
+
+
+
+ The current
+
+
+
+
+ A that completes when the server calls /world/Reboot()
+
+
+
+
+ Releases the without terminating it. Also calls
+
+ which can be used to create a new similar to this one
+
+
+
+ Sends a command to DreamDaemon through /world/Topic()
+
+ The sanitized command to send
+ The for the operation
+ A resulting in the result of /world/Topic()
+
+
+
+ Causes the world to start listening on a
+
+ The port to change to
+ The for the operation
+ A resulting in if the operation succeeded, otherwise
+
+
+
+ Attempts to change the current to
+
+ The new
+ The for the operation
+ A resulting in if the operation succeeded, otherwise
+
+
+
+ Changes to without telling the DMAPI
+
+
+
+
+ Enables the reading of custom chat commands from the
+
+
+
+
+ Factory for s
+
+
+
+
+ Create a from a freshly launch DreamDaemon instance
+
+ The to use. will be updated with the minumum required security level for the launch
+ The to use
+ The current if any
+ If the of should be used
+ If the of should be used
+ If the should only validate the DMAPI then exit
+ The for the operation
+ A resulting in a new
+
+
+
+ Create a from an existing DreamDaemon instance
+
+ The to use
+ The for the operation
+ A resulting in a new on success or on failure to reattach
+
+
+
+ Creates a that appears to have started and died with exit code -1
+
+ The for the
+ A dead
+
+
+
+ Runs and monitors the twin server controllers
+
+
+
+
+ If the watchdog is running
+
+
+
+
+ If the alpha server is the active server
+
+
+
+
+ The currently running on the server
+
+
+
+
+ The the active server is using
+
+
+
+
+ The to be applied
+
+
+
+
+ The of the active server
+
+
+
+
+ Start the
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Changes the . If currently triggers a graceful restart
+
+ The new . May be modified
+ The for the operation
+ A representing the running operation
+
+
+
+ Restarts the watchdog
+
+ If the restart will be delayed until a reboot is detected in the active server's DMAPI and this function will retrun immediately
+ The for the operation
+ A representing the running operation
+
+
+
+ Stops the watchdog
+
+ If the termination will be delayed until a reboot is detected in the active server's DMAPI and this function will return immediately
+ The for the operation
+ A representing the running operation
+
+
+
+ Cancels pending graceful actions
+
+ The for the operation
+ A representing the running operation
+
+
+
+ For creating s
+
+
+
+
+ Creates a
+
+ The for the
+ The for the with
+ The for the
+ The for the
+ The for the
+ The for the
+ The initial for the
+ A new
+
+
+
+ Represents the result of trying to start a DD process
+
+
+
+
+ The time it took for to return. If the startup timed out
+
+
+
+
+ The if it exited
+
+
+
+
+
+
+
+ The action for the monitor loop to take when control is returned to it
+
+
+
+
+ The monitor should continue as normal
+
+
+
+
+ Skips the next call to HandleMonitorWakeup action
+
+
+
+
+ The monitor should kill and restart both servers
+
+
+
+
+ The monitor should stop checking actions for this iteration and continue its loop
+
+
+
+
+ The monitor should exit. Does not kill servers
+
+
+
+
+ Reasons for the monitor to wake up
+
+
+
+
+ The active server crashed or exited
+
+
+
+
+ The inactive server crashed or exited
+
+
+
+
+ The active server called /world/Reboot()
+
+
+
+
+ The inactive server called /world/Reboot()
+
+
+
+
+ The inactive server is past that point where DD hangs when you press "Go"
+
+
+
+
+ A new .dmb was deployed
+
+
+
+
+ Server launch parameters were changed
+
+
+
+
+ The (absolute) state of the
+
+
+
+
+ If the inactive server is being rebooted
+
+
+
+
+ If the inactive server is in an unrecoverable state
+
+
+
+
+ The next to take in
+
+
+
+
+ The active
+
+
+
+
+ The inactive
+
+
+
+
+
+
+
+
+
+
+ Parameters necessary for duplicating a session
+
+
+
+
+ The used by DreamDaemon
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a from a given and
+
+ The to copy values from
+ The value of
+
+
+
+ Represents the action to take when /world/Reboot() is called
+
+
+
+
+ Run DreamDaemon's normal reboot process
+
+
+
+
+ Shutdown DreamDaemon
+
+
+
+
+ Restart the DreamDaemon process
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The up to date
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The level the was launched with
+
+
+
+
+ The waits on when DreamDaemon currently has it's ports closed
+
+
+
+
+ The port to assign DreamDaemon when it queries for it
+
+
+
+
+ The that completes when DD tells us about a reboot
+
+
+
+
+ If we know DreamDaemon currently has it's port closed
+
+
+
+
+ If the has been disposed
+
+
+
+
+ The for the
+
+
+
+
+ If should be kept alive instead
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The optional time to wait before failing the
+
+
+
+ Finalizes an instance of the class.
+
+ The finalizer dispose pattern is necessary so we don't accidentally leak the executable
+
+
+
+
+
+
+ Implements the pattern
+
+ If this function was NOT called by the finalizer
+
+
+
+
+
+
+ Throws an if has been called
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Change a given into the appropriate DreamDaemon command line word
+
+ The level to change
+ A representation of the command line parameter
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The time in seconds to wait from starting to start . Does not take responsiveness into account
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ If the should in
+
+
+
+
+ The for the monitor loop
+
+
+
+
+ The running the monitor loop
+
+
+
+
+ that completes when are changed and we are
+
+
+
+
+ Server designation alpha
+
+
+
+
+ Server designation bravo
+
+
+
+
+ If the servers should be released instead of shutdown
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The to populate with
+ The value of
+ The value of
+ The initial value of . May be modified
+ The value of
+ The value of
+
+
+
+
+
+
+ Call on and and set them to
+
+
+
+
+ Implementation of . Does not lock
+
+ If the termination will be delayed until a reboot is detected in the active server's DMAPI and this function will return immediately
+ If the termination will be announced using
+ The for the operation
+
+
+
+ Handles the actions to take when the monitor has to "wake up"
+
+ The that caused the invocation
+ The current . Will be modified upon retrn
+ The for the operation
+ A representing the running operation
+
+
+
+ The loop that watches the watchdog
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Stops . Doesn't kill the servers
+
+ if the monitor was running, otherwise
+
+
+
+
+
+
+ Launches the
+
+ If should be started by this function
+ If the launch should be announced to chat by this function
+ to use, if any
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+ Reattach information for a
+
+
+
+
+ for the Alpha session
+
+
+
+
+ for the Bravo session
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a from a given with a given and
+
+ The to copy information from
+ The used to build
+ The used to build
+
+
+
+
+
+
+
+
+
+ Number of times to send the button click message. Should be at least 2 or it may fail to focus the window
+
+
+
+
+ Check for prompts each time this amount of milliseconds pass
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The list of s registered
+
+
+
+
+ The representing the lifetime of the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Configuration options for the
+
+
+
+
+ The key for the the resides in
+
+
+
+
+ The to create
+
+
+
+
+ If the admin user should be enabled and have it's password reset
+
+
+
+
+ The connection string for the database
+
+
+
+
+ If the database should be deleted on application startup. Should not be used in production!
+
+
+
+
+ The form of the of a target MySQL/MariaDB server
+
+
+
+
+ Type of database to user
+
+
+
+
+ Use Microsoft SQL Server
+
+
+
+
+ Use MySQL
+
+
+
+
+ Use MariaDB
+
+
+
+
+ File logging configuration options
+
+
+
+
+ The key for the the resides in
+
+
+
+
+ Default value for
+
+
+
+
+ Default value for
+
+
+
+
+ Where log files are stored
+
+
+
+
+ If file logging is disabled
+
+
+
+
+ The minimum to display in logs
+
+
+
+
+ The minimum to display in logs for Microsoft library sources
+
+
+
+
+ General configuration options
+
+
+
+
+ The key for the the resides in
+
+
+
+
+ The default value for
+
+
+
+
+ The default value for
+
+
+
+
+ Minimum length of database user passwords
+
+
+
+
+ A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
+
+
+
+
+ The
+
+
+
+
+ The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single topic exchange can take up to twice this value
+
+
+
+
+ Determines if the will run
+
+
+
+
+ Run the wizard if the appsettings.{Environment}.json is not present or empty
+
+
+
+
+ Force run the wizard
+
+
+
+
+ Only run the wizard and exit
+
+
+
+
+ Never run the wizard
+
+
+
+
+ Configuration for the automatic update system
+
+
+
+
+ The key for the the resides in
+
+
+
+
+ The tgstation/tgstation-server
+
+
+
+
+ The default value of
+
+
+
+
+ The default value of
+
+
+
+
+ The of the tgstation-server fork to recieve updates from
+
+
+
+
+ Prefix before the of TGS published in git tags
+
+
+
+
+ Asset package containing the new assembly in zip form
+
+
+
+
+ for
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct an
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The for the
+ The containing value of
+ The containing value of
+
+
+
+
+
+
+
+
+
+ Attempts to restart the server
+
+ A resulting in the of the request
+
+
+
+ A for API functions
+
+
+
+
+ The for the operation
+
+
+
+
+ The for the operation
+
+
+
+
+ The for the operation
+
+
+
+
+ The for the
+
+
+
+
+ The for the operation
+
+
+
+
+ If permissions are required to access the
+
+
+
+
+ Construct an
+
+ The value of
+ The for the
+ The value of
+ The value of
+
+
+
+
+
+
+ Controller for managing s
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+ for managing s
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The for the
+
+
+
+ Converts to a
+
+ The
+ A based on
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for s
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The for the
+
+
+
+ If a should be returned from actions due to conflicts with one or both of the or the or a given tries to access parent directories
+
+ The path to validate if any
+ The to use when calling into
+ if a should be returned, otherwise
+
+
+
+
+
+
+ Get the contents of a file at a
+
+ The path of the file to get
+ The for the operation
+ A resulting in the for the operation
+
+
+
+ Get the contents of a directory at a
+
+ The path of the directory to get
+ The for the operation
+ A resulting in the for the operation
+
+
+
+
+
+
+
+
+
+ Deletes an empty
+
+ A representing the path to the directory to delete
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ for managing the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The for the
+
+
+
+
+
+
+
+
+
+ Implementation of
+
+ The to operate on if any
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Stops DreamDaemon if it's running
+
+ The for the operation
+ A resulting in the of the operation
+
+
+
+
+
+
+ Handle a HTTP PATCH to the
+
+ The for the operation
+ A resulting in the of the request
+
+
+
+ Controller for managing the compiler
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Main for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The for the
+
+
+
+ Returns the version of the
+
+
+
+
+
+ Attempt to authenticate a using
+
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Controller for managing s
+
+
+
+
+ File name to allow attaching instances
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For managing s
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The for the
+
+
+
+ Checks a for errors
+
+ The to check
+ A explaining any errors, if none
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ for s
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An representing a
+
+ The model being represented
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The for the
+ If the requires an
+
+
+
+ Attempt to create a
+
+ The being created
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Attempt to read a
+
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Attempt to get a specific a
+
+ The ID of the model to get
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Attempt to update a
+
+ The being updated
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Attempt to delete a model with a particular
+
+ The ID of the model to delete
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Attempt to list entries of the
+
+ The for the operation
+ A resulting in the of the operation
+
+
+
+ Controller for managing the s
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The value of
+ The for the
+ The containing value of
+
+
+
+
+
+
+ Delete the
+
+ The for the operation
+ A resulting in the of the operation
+
+
+
+
+
+
+
+
+
+ Helper for using the with the system
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ Construct a for
+
+ The rights required
+
+
+
+ For managing s
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The for the
+ The value of
+ The value of
+ The value of
+ The containing the value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The used for determining when the is
+
+
+
+
+ The for the
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+
+
+
+ Configure dependency injected services
+
+ The to configure
+
+
+
+ Configure the
+
+ The to configure
+ The for the
+ The value of
+ The for the
+
+
+
+
+
+
+ Extensions for
+
+
+
+
+ Gets a from a given
+
+ The to get the from
+ A new
+
+
+
+ Return a for s
+
+ The to configure
+
+
+
+ Suppress TaskCanceledException warnings when a user aborts a request
+
+ The to configure
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of . Created scopes must be able to provide instances of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+ Create a
+
+ A new
+
+
+
+
+
+
+
+
+
+ Configures the ASP.NET Core web application
+
+
+
+
+ Prefix to
+
+
+
+
+ A more verbose version of
+
+
+
+
+ The version of the
+
+
+
+
+ Mark the as ready to run
+
+ The that put the application in a corrupted state if any
+
+
+
+ For waiting asynchronously
+
+
+
+
+ Create a that completes after a given
+
+ The that must elapse
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for scoping usage of s. Meant for use by
+
+
+
+
+ Run an in the scope of an
+
+ The operation to run
+ A representing the running
+
+
+
+ For creating
+
+
+
+
+ Create a
+
+ The
+ The to create
+ A new
+
+
+
+ For creating s
+
+
+
+
+ Create a client with anonymous authentication. Low rate limit
+
+ A new
+
+
+
+ Create a client with authentication using a personal access token
+
+ The GitHub personal access token
+ A new
+
+
+
+ Manages the runtime of s
+
+
+
+
+ Get the for a
+
+ The to get for
+ The of
+
+
+
+ Registers a given and begins running it
+
+ The
+ The operation to run taking the started , a , progress reporter and a
+ The for the operation
+ A representing a running operation
+
+
+
+ Wait for a given to complete
+
+ The to wait for
+ The to cancel the
+ A that will cancel the
+ The for the operation
+ A representing the
+
+
+
+ Cancels a give
+
+ The to cancel
+ The who cancelled the
+ If the operation should wait until the job exits before completing
+ The for the operation
+ A resulting in if the was cancelled, if it couldn't be found
+
+
+
+ For identifying the current platform
+
+
+
+
+ If the current platform is a Windows platform
+
+
+
+
+ The extension of executable script files for the system
+
+
+
+
+ Abstraction over a
+
+
+
+
+ The ' ID
+
+
+
+
+ The representing the time until the becomes "idle"
+
+
+
+
+ Get the stderr output of the
+
+ The stderr output of the
+
+
+
+ Get the stdout output of the
+
+ The stdout output of the
+
+
+
+ Get the stderr and stdout output of the
+
+ The stderr and stdout output of the
+
+
+
+ Terminates the process
+
+
+
+
+ Represents process lifetime
+
+
+
+
+ The resulting in the exit code of the process
+
+
+
+
+ Set's the owned to
+
+
+
+
+ For launching '
+
+
+
+
+ Launch a
+
+ The full path to the executable file
+ The working directory for the
+ The arguments for the
+ If standard output should be read
+ If standard error should be read
+ If shell execute should not be used. Ignored if or are set
+ A new
+
+
+
+ Get a by
+
+ The
+ The represented by on success, on failure
+
+
+
+ Handler for server restarts
+
+
+
+
+ Handle a restart of the server
+
+ The being updated to, if not being changed
+ The for the operation
+ A representing the running operation
+
+
+
+ Represents the lifetime of a registration
+
+
+
+
+ Represents a service that may take an updated assembly and run it, stopping the current assembly in the process
+
+
+
+
+ if live updates are supported, . and will fail if this is
+
+
+
+
+ Run a new assembly and stop the current one. This will likely trigger all active s
+
+ The the is updating to
+ The that points to the .zip file that contains the new assembly
+ The for the operation
+ if the update started successfully, if there was another update in progress
+
+
+
+ Register a given to run before stopping the server for a restart
+
+ The to register
+ A new representing the scope of the registration
+
+
+
+ Restarts the
+
+ A representing the running operation
+
+
+
+ The command line setup wizard
+
+
+
+
+ Run the setup wizard if necessary
+
+ The for the operation
+ A resulting in if the wizard ran, otherwise
+
+
+
+ Operation exceptions thrown from the context of a
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a with a
+
+ The message for the
+
+
+
+ Construct a with a and
+
+ The message for the
+ The inner for the nase
+
+
+
+ Class for pairing s with s
+
+
+
+
+ The for
+
+
+
+
+ The being run
+
+
+
+
+ Construct a
+
+ A taking a and returning a that the will wrap
+
+
+
+
+
+
+ The progress of the job
+
+
+
+
+ Wait for to complete
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Cancels
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ of to running s
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+ Gets the for a given if it exists
+
+ The to get the for
+ The
+
+
+
+ Runner for s
+
+ The being run
+ The operation for the
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Construct a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ If was NOT just created
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Create a resulting in the exit code of a given
+
+ The to attach the for
+ A new resulting in the exit code of
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ The
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+
+
+
+ Async lock context helper
+
+
+
+
+ Asyncronously locks a
+
+ The to lock
+ The for the operation
+ A resulting in the for the lock
+
+
+
+ The locked
+
+
+
+
+ If has been called
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+ Finalizes an instance of the class.
+
+
+
+
+ Release the lock on
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The value of
+ The containing the value of
+
+
+
+ A prompt for a yes or no value
+
+ The question
+ The for the operation
+ A resulting in if the user replied yes, otherwise
+
+
+
+ Prompts the user to enter the port to host TGS on
+
+ The for the operation
+ A resulting in the hosting port, or to use the default
+
+
+
+ Prompts the user to create a
+
+ The for the operation
+ A resulting in the new
+
+
+
+ Prompts the user to create a
+
+ The for the operation
+ A resulting in the new
+
+
+
+ Prompts the user to create a
+
+ The for the operation
+ A resulting in the new
+
+
+
+ Saves a given set to
+
+ The file to save the to
+ The hosting port to save
+ The to save
+ The to save
+ The to save
+ The for the operation
+ A representing the running operation
+
+
+
+ Runs the
+
+ The path to the settings json to build
+ The for the operation
+ A representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ that resolves paths to
+
+
+
+
+ Default buffer size used by .NET
+
+
+
+
+ Recursively empty a directory
+
+ of the directory to empty
+ The for the operation
+ A representing the running operation
+
+
+
+ Opens a for async writing at a given
+
+ The path to open the at
+ A new ready for async writing
+
+
+
+ Copies a directory from to
+
+ The source directory path
+ The destination directory path
+ Files and folders to ignore at the root level
+ The for the operation
+ A of s representing the running operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Abstraction for
+
+
+
+
+ If the is visible to the user
+
+
+
+
+ Write some to the
+
+ The to write
+ If there should be a new line after the
+ The for the operation
+ A representing the running operation
+
+
+
+ Wait for a key press on the
+
+ The for the operations
+ A representing the running operation
+
+
+
+ Read a line from the
+
+ If the input should be retrieved using the '*' character
+ The for the operation
+ A resulting in the read by the
+
+
+
+ Interface for using filesystems
+
+
+
+
+ Retrieve the full path of some given a relative path. Must be used before passing relative paths to other APIs. All other operations in this call this internally on given paths
+
+ Some path to retrieve the full path of
+ as a full canonical path
+
+
+
+ Gets the file name portion of a
+
+ The path to get the file name of
+ The file name portion of
+
+
+
+ Gets the file name portion of a with
+
+ The path to get the file name of
+ The file name portion of
+
+
+
+ Check if a contains the '..' parent directory accessor
+
+ The path to check
+ if contains a '..' accessor, otherwise
+
+
+
+ Copies a directory from to
+
+ The source directory path
+ The destination directory path
+ Files and folders to ignore at the root level
+ The for the operation
+ A representing the running operation
+
+
+
+ Check that the file at exists
+
+ The file to check for existence
+ The for the operation
+ A resulting in if the file at exists, otherwise
+
+
+
+ Check that the directory at exists
+
+ The directory to check for existence
+ The for the operation
+ A resulting in if the directory at exists, otherwise
+
+
+
+ Returns all the contents of a file at as a array
+
+ The path of the file to read
+ A for the operation
+ A that results in the contents of a file at
+
+
+
+ Returns directory names in a given
+
+ The path to search for directories
+ The for the operation
+ A resulting in the directories in
+
+
+
+ Returns file names in a given
+
+ The path to search for files
+ The for the operation
+ A resulting in the files in
+
+
+
+ Writes some to a file at overwriting previous content
+
+ The path of the file to write
+ The contents of the file
+ A for the operation
+ A representing the running operation
+
+
+
+ Copy a file from to
+
+ The source file to copy
+ The destination path
+ A for the operation
+ A representing the running operation
+
+
+
+ Gets the directory portion of a given
+
+ A path to check
+ The directory portion of the given
+
+
+
+ Gets a list of files in with the given
+
+ The directory which contains the files
+ The extension to look for without the preceeding "."
+ A for the operation
+ A resulting in a list of paths to files in with the given
+
+
+
+ Deletes a file at
+
+ The path of the file to delete
+ A for the operation
+ A representing the running operation
+
+
+
+ Create a directory at
+
+ The path of the directory to create
+ A for the operation
+ A representing the running operation
+
+
+
+ Recursively delete a directory
+
+ The path to the directory to delete
+ A for the operation
+ A representing the running operation
+
+
+
+ Combines an array of strings into a path
+
+ The paths to combine
+ The combined path
+
+
+
+ Moves a file at to
+
+ The source file path
+ The destination path
+ A for the operation
+ A representing the running operation
+
+
+
+ Moves a directory at to
+
+ The source directory path
+ The destination path
+ A for the operation
+ A representing the running operation
+
+
+
+ Downloads a file from
+
+ The URL to download
+ A for the operation
+ A resulting in the s of the downloaded file
+
+
+
+ Extract a set of to a given
+
+ The path to unzip to
+ The s of the
+ The for the operation
+ A representing the running operation
+
+
+
+ Handles changing file modes/permissions after writing
+
+
+
+
+ For handling system specific necessities after a write
+
+ The full path to the file that was written
+
+
+
+ For creating filesystem symbolic links
+
+
+
+
+ Create a symbolic link
+
+ The path to the hard target
+ The path to the link
+ The for the operation
+ A representing the running operation
+
+
+
+ For accessing the disk in a synchronous manner
+
+
+
+
+ Enumerate files in a given
+
+ The path to look for files in
+ The for the operation
+ A of file names in
+
+
+
+ Enumerate directories in a given
+
+ The path to look for directories in
+ The for the operation
+ A of directory names in
+
+
+
+ Create an empty directory at
+
+ The path to create
+ The for the operation. Usage may result in partial writes
+ if the directory already existed, otherwise
+
+
+
+ Read the s of a file at a given
+
+ The path of the file to read
+ A array representing the contents of the file at
+
+
+
+ Deletes a directory at if it's empty
+
+ The path of the directory to delete
+ if the directory does not exist or is empty and was deleted. otherwise
+
+
+
+ Write to a file at a given
+
+ The path to the file to write
+ The new contents of the file
+ The function only succeeds if this parameter matches the SHA-1 hash of the contents of the current file. Contains the SHA1 of the file on disk once the function returns
+ The for the operation
+ on success, if the operation failed due to not matching the file's contents
+
+
+
+ Checks if a given is a directory
+
+ The path to check
+ if is a directory, otherwise
+
+
+
+ for POSIX systems
+
+
+
+
+
+
+
+ for posix systems
+
+
+
+
+
+
+
+ An that resolve relative paths from another to a subdirectory of that
+
+
+
+
+ Path to the subdirectory attached to path resolutions
+
+
+
+
+ Construct a
+
+ The that resolves to the directory to work out of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ for Windows systems
+
+
+
+
+
+
+
+ for windows systems
+
+
+
+
+
+
+
+ Represents the host
+
+
+
+
+ If the should restart
+
+
+
+
+ Runs the
+
+ The for the operation
+ A representing the running operation
+
+
+
+ For creating s
+
+
+
+
+ Create a
+
+ The arguments for the
+ The directory in which to install server updates
+ A new
+
+
+
+
+
+
+ The
+
+
+
+
+ The parent
+
+
+
+
+ See
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The
+
+
+
+
+ The
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+ See
+
+
+
+
+ The of
+
+
+
+
+ See
+
+
+
+
+ The the was made with in string form
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The s in the
+
+
+
+
+ The s om the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The for the
+ The containing the value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ If the MY_ class of migrations should be used instead of the MS_ class
+
+ if the MY_ class of migrations should be used instead of the MS_ class, otherwise
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+ Add a default admin to a given
+
+ The to add an admin to
+
+
+
+
+
+
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The PID of a currently running DD instance
+
+
+
+
+ The access token used for communication with DD
+
+
+
+
+ The
+
+
+
+
+ The parent
+
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The
+
+
+
+
+ The parent
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+ Represents the database
+
+
+
+
+ The s in the
+
+
+
+
+ The s in the
+
+
+
+
+ The s in the
+
+
+
+
+ The s in the
+
+
+
+
+ The s in the
+
+
+
+
+ The s in the
+
+
+
+
+ The in the
+
+
+
+
+ The in the
+
+
+
+
+ The in the
+
+
+
+
+ The in the
+
+
+
+
+ The in the
+
+
+
+
+ The for s
+
+
+
+
+ The for s
+
+
+
+
+ Saves changes made to the
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Creates and migrates the
+
+ The for the operation
+ A representing the running operation
+
+
+
+ Attempt to downgrade the schema to the migration used for a given server
+
+ The tgstation-server that the schema should downgrade for
+ The for the operation
+ A representing the running operation
+
+
+
+ For initially seeding a database
+
+
+
+
+ Initially seed a given
+
+ The to seed
+ The for the operation
+ A representing the running operation
+
+
+
+ Changes the admin password in back to it's default and enables the account
+
+ The to reset the admin password for
+ The for the operation
+ A representing the running operation
+
+
+
+ Represents an in the database
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The s in the
+
+
+
+
+ The s for the
+
+
+
+
+ The s in the
+
+
+
+
+ The in the
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The of
+
+
+
+
+ The the belongs to
+
+
+
+
+ If the has any instance rights
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+ See
+
+
+
+
+ See
+
+
+
+
+ The the job belongs to if any
+
+
+
+
+ A to run after the job completes. This will not affect the time, unless it is cancelled or errors
+
+ This should only be used where there are database dependencies that also rely on the Job itself completing A.K.A. manually initiated s
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+ The initial database migration for MSSQL
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ The initial database migration for MySQL/MariaDB
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Add the and columns for MySQL/MariaDB
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Add the and columns for MSSQL
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Cleans up of nullable columns and foreign keys MySQL/MariaDB
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Cleans up of nullable columns and foreign keys MSSQL
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Marks the s of s as non-nullable for MSSQL
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Marks the s of s as non-nullable for MySQL/MariaDB
+
+
+
+
+ Applies the migration
+
+ The to use
+
+
+
+ Unapplies the migration
+
+ The to use
+
+
+
+ Builds the target model
+
+ The to use
+
+
+
+ Contains helpers for creating design time s
+
+
+
+
+ Path to the json file to use for migrations configuration
+
+
+
+
+ Path to the development json file to use for migrations configuration
+
+
+
+
+ Get the for the
+
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ for MySQL
+
+
+
+
+ Construct a
+
+ The for the
+ The of for the
+ The for the
+ The for the
+
+
+
+
+
+
+
+
+
+ Database representation of
+
+
+
+
+ The row Id
+
+
+
+
+ The for the
+
+
+
+
+ Base class for
+
+
+
+
+ Used to identify and authenticate the DreamDaemon instance
+
+
+
+
+ The system process ID
+
+
+
+
+ If the of the associated dmb is being used
+
+
+
+
+ The port DreamDaemon was last listening on
+
+
+
+
+ The current DreamDaemon reboot state
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a from a given
+
+ The to copy values from
+
+
+
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The
+
+
+
+
+ The parent
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+ Many to many relationship for and
+
+
+
+
+ The row Id
+
+
+
+
+ The
+
+
+
+
+ The
+
+
+
+
+
+
+
+ The row Id
+
+
+
+
+ The the belongs to
+
+
+
+
+ See
+
+
+
+
+ See
+
+
+
+
+ See s made from this
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+ for Sqlserver
+
+
+
+
+ Construct a
+
+ The for the
+ The of for the
+ The for the
+ The for the
+
+
+
+
+
+
+
+
+
+
+
+
+ See
+
+
+
+
+ The initial the was merged with
+
+
+
+
+ Foreign key for
+
+
+
+
+ All the for the
+
+
+
+
+ Convert the to it's API form
+
+ A new
+
+
+
+
+
+
+ The hash of the user's password
+
+
+
+
+ See
+
+
+
+
+ The uppercase invariant of
+
+
+
+
+ When was last changed
+
+
+
+
+ s created by this
+
+
+
+
+ The s for the
+
+
+
+
+ The s made by the
+
+
+
+
+ See
+
+ If we should recurse on
+ If rights and system identifier should be shown
+ A new
+
+
+
+ Convert the to it's API form
+
+ If rights and system identifier should be shown
+ A new
+
+
+
+ Database representation of
+
+
+
+
+ The row Id
+
+
+
+
+ The of the the belongs to
+
+
+
+
+ The for the Alpha server
+
+
+
+
+ The for the Bravo server
+
+
+
+
+ Base class for
+
+
+
+
+ If the Alpha session is the active session
+
+
+
+
+ Construct a
+
+
+
+
+ Construct a from a given
+
+ The to copy values from
+
+
+
+ Native methods used by the code
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#parameters
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindoww
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage
+
+
+
+
+ See https://msdn.microsoft.com/en-us/library/ms633493(v=VS.85).aspx
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumchildwindows
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextw
+
+
+
+
+ See https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx
+
+
+
+
+ See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinkw
+
+
+
+
+ Entrypoint for the
+
+
+
+
+ The to use
+
+
+
+
+ Entrypoint for the
+
+ The command line arguments
+ The
+
+
+
+ Manages s for a scope
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Construct an empty
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+ Length in s of generated base64 secure string
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents the currently authenticated
+
+
+
+
+ The authenticated user
+
+
+
+
+ The of if applicable
+
+
+
+
+ Get the value of a given
+
+ The of the right to get
+ The value of . Note that if is all based rights will return 0
+
+
+
+ The of if applicable
+
+
+
+
+ For creating and accessing authentication contexts
+
+
+
+
+ The the created
+
+
+
+
+ Create an to populate
+
+ The of the
+ The of the operation
+ The the resulting 's password must be valid after
+ The for the operation
+ A representing the running operation
+
+
+
+ For injecting s that can look for
+
+
+
+
+ Setup the s for a given
+
+ The containing the and of the request and the to add s to
+ The for the operation
+ A representing the running operation
+
+
+
+ Contains various cryptographic functions
+
+
+
+
+ Generates a secure set of s
+
+ The amount of s to generate
+ A secure set of s
+
+
+
+ Sets a for a given
+
+ The whos is to be set
+ The new password for the
+ If the is just being created
+
+
+
+ Checks a given matches a given 's . This may result in being modified and this should be persisted
+
+ The to check
+ The password to check
+ if matches the hash, otherwise
+
+
+
+ Generates a 40-length secure ascii
+
+ A 40-length secure ascii
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ The map of s to s
+
+
+
+
+ Construct an
+
+ The value of
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ For keeping a specific alive for a period of time
+
+
+
+
+ The the manages
+
+
+
+
+ The for the
+
+
+
+
+ The to clean up
+
+
+
+
+ Construct an
+
+ The value of
+ The used to delay the expiry
+ The to take on expiry
+ The
+
+
+
+
+
+
+ For caching s
+
+
+
+
+ Keep a 's alive until an time
+
+ The the belongs to
+ The to cache
+ When the should expire
+
+
+
+ Attempt to load a cached
+
+ The the belongs to
+ The cached or if it doesn't exist or expired
+
+
+
+ Represents a user on the current
+
+
+
+
+ A unique identifier for the user
+
+
+
+
+ The user's name
+
+
+
+
+ Clone the creating another copy that must have called on it
+
+ A new mirroring the current one
+
+
+
+ Runs a given in the context of the
+
+ The to perform, should be simple and not use any s or threading
+ The for the operation
+ A representing the running operation
+
+
+
+ Factory for s
+
+
+
+
+ Create a for a given
+
+ The user to create a for
+ The for the operation
+ A new or if the has no
+
+
+
+ Create a for a given username and password
+
+ The username of the user
+ The password of the user
+ The for the operation
+ A new
+
+
+
+ For creating s
+
+
+
+
+ The for the
+
+
+
+
+ Create a for a given
+
+ The to create the token for. Must have the field available
+ The for the operation
+ A resulting in a new
+
+
+
+ for posix systems
+
+ TODO: Blocked by https://github.com/dotnet/corefx/issues/3187
+
+
+
+
+
+
+
+
+
+
+
+
+ Amount of minutes until generated s expire
+
+
+
+
+ Amount of minutes to skew the clock for validation
+
+
+
+
+ Amount of bytes to use in the
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ Construct a
+
+ The value of
+ The used for generating the
+
+
+
+
+
+
+ for windows systems
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ Construct a using a
+
+ The value of
+
+
+
+ Construct a using a
+
+ The value of
+
+
+
+
+
+
+
+
+
+
+
+
+ for windows systems. Uses long running tasks due to potential networked domains
+
+
+
+
+ The for the
+
+
+
+
+ Extract the username and domain name from a in the format "username\\domainname"
+
+ The input
+ The output username
+ The output domain name. May be
+
+
+
+ Construct a
+
+ The value of logger
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The for the
+
+
+
+
+ The s to run when the restarts
+
+
+
+
+ The absolute path to install updates to
+
+
+
+
+ The for the
+
+
+
+
+ The for the
+
+
+
+
+ If a server update has been or is being applied
+
+
+
+
+ Construct a
+
+ The value of
+ The value of
+
+
+
+ Throws an if the cannot be used
+
+ If should be checked
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Implements
+
+ The of any potential updates being applied
+ A representing the running operation
+
+
+
+
+
+
+
+
+
diff --git a/src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs b/src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs
index b0526707b9..6b562f056e 100644
--- a/src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs
+++ b/src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs
@@ -33,7 +33,7 @@ namespace Tgstation.Server.Host.Components.Byond
/// The path to the BYOND installation
/// The of BYOND being installed
/// The for the operation
- ///
+ /// A representing the running operation
Task InstallByond(string path, Version version, CancellationToken cancellationToken);
///
diff --git a/src/Tgstation.Server.Host/Components/Byond/IByondManager.cs b/src/Tgstation.Server.Host/Components/Byond/IByondManager.cs
index 767d15537e..7ace2266ac 100644
--- a/src/Tgstation.Server.Host/Components/Byond/IByondManager.cs
+++ b/src/Tgstation.Server.Host/Components/Byond/IByondManager.cs
@@ -26,6 +26,7 @@ namespace Tgstation.Server.Host.Components.Byond
///
/// The new
/// The for the operation
+ /// A representing the running operation
Task ChangeVersion(Version version, CancellationToken cancellationToken);
///
diff --git a/src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs b/src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs
index 13b5a68f74..858d4bc8c0 100644
--- a/src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs
@@ -27,7 +27,7 @@ namespace Tgstation.Server.Host.Components.Chat.Commands
///
/// Construct a
///
- ///
+ /// The value of
public VersionCommand(IApplication application)
{
this.application = application ?? throw new ArgumentNullException(nameof(application));
diff --git a/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs b/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs
index 00f8ade0a5..41646c7813 100644
--- a/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs
@@ -38,6 +38,15 @@ namespace Tgstation.Server.Host.Components.Chat
bool active;
+ ///
+ /// Construct a
+ ///
+ /// The value of
+ /// The value of
+ /// The value of
+ /// The value of
+ /// The value of
+ /// The value of
public JsonTrackingContext(IIOManager ioManager, ICustomCommandHandler customCommandHandler, ILogger logger, Action onDispose, string commandsPath, string channelsPath)
{
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
index 8716ad3d0a..cce4b47d37 100644
--- a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
@@ -256,6 +256,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
client.WriteLine("CAP REQ :sasl", Priority.Critical); // needs to be put in the buffer before anything else
cancellationToken.ThrowIfCancellationRequested();
}
+
client.Login(nickname, nickname, 0, nickname);
}
@@ -317,6 +318,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
if (client.GetIrcUser(nickname) == null)
client.RfcNick(nickname);
}
+
client.Listen();
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
}
@@ -329,6 +331,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
logger.LogWarning("Unable to connect to IRC: {0}", e);
return false;
}
+
return true;
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
@@ -397,6 +400,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
id = channelIdCounter++;
channelIdMap.Add(id.Value, x.IrcChannel);
}
+
return new Channel
{
RealId = id.Value,
diff --git a/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs b/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs
index 3a30381407..a95ac591c6 100644
--- a/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs
@@ -105,7 +105,7 @@ namespace Tgstation.Server.Host.Components.Compiler
var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
Task otherTask;
- // lock (this) //already locked below
+ // lock (this) //already locked below
otherTask = cleanupTask;
await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
}
diff --git a/src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs b/src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs
index 31cbba7d18..bca0d73fbf 100644
--- a/src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs
+++ b/src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs
@@ -16,9 +16,6 @@ namespace Tgstation.Server.Host.Components.Compiler
///
public string SecondaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.BDirectoryName));
- ///
- public RevisionInformation RevisionInformation => CompileJob.RevisionInformation;
-
///
/// The for the
///
diff --git a/src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs b/src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs
index f06ebd066b..fc153bb22c 100644
--- a/src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs
@@ -43,6 +43,5 @@ namespace Tgstation.Server.Host.Components.Compiler
/// The for the operation
/// A representing the running operation
Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken);
-
}
}
diff --git a/src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs b/src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs
index 3cd0962106..628f77eb0b 100644
--- a/src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs
+++ b/src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs
@@ -36,6 +36,7 @@ namespace Tgstation.Server.Host.Components.Compiler
///
public void Dispose() { }
+ ///
public void KeepAlive() => throw new NotSupportedException();
}
}
\ No newline at end of file
diff --git a/src/Tgstation.Server.Host/Components/EventConsumer.cs b/src/Tgstation.Server.Host/Components/EventConsumer.cs
index e28d93051f..e204cbcf8f 100644
--- a/src/Tgstation.Server.Host/Components/EventConsumer.cs
+++ b/src/Tgstation.Server.Host/Components/EventConsumer.cs
@@ -16,7 +16,7 @@ namespace Tgstation.Server.Host.Components
readonly IConfiguration configuration;
///
- /// The for the
+ /// The for the
///
IWatchdog watchdog;
@@ -46,8 +46,10 @@ namespace Tgstation.Server.Host.Components
/// The value of
public void SetWatchdog(IWatchdog watchdog)
{
+#pragma warning disable IDE0016 // Use 'throw' expression
if (watchdog == null)
throw new ArgumentNullException(nameof(watchdog));
+#pragma warning restore IDE0016 // Use 'throw' expression
if (this.watchdog != null)
throw new InvalidOperationException("watchdog already set!");
this.watchdog = watchdog;
diff --git a/src/Tgstation.Server.Host/Components/EventType.cs b/src/Tgstation.Server.Host/Components/EventType.cs
index c9da72aa68..f711742dbe 100644
--- a/src/Tgstation.Server.Host/Components/EventType.cs
+++ b/src/Tgstation.Server.Host/Components/EventType.cs
@@ -9,18 +9,22 @@
/// Parameters: Reference name, commit sha
///
RepoResetOrigin = 0,
+
///
/// Parameters: Checkout target
///
RepoCheckout = 1,
+
///
/// No parameters
///
RepoFetch = 2,
+
///
/// Parameters: Pull request number, pull request sha, merger message
///
RepoMergePullRequest = 3,
+
///
/// Parameters: Absolute path to repository root
///
@@ -30,26 +34,32 @@
/// Parameters: Version being installed
///
ByondInstallStart = 5,
+
///
/// Parameters: Error string
///
ByondInstallFail = 6,
+
///
/// Parameters: Old active version, new active version
///
ByondActiveVersionChange = 7,
+
///
/// Parameters: Game directory path, origin commit sha
///
CompileStart = 8,
+
///
/// No parameters
///
CompileCancelled = 9,
+
///
/// Parameters: Game directory path, "1" if compile succeeded and api validation failed, "0" otherwise
///
CompileFailure = 10,
+
///
/// Parameters: Game directory path
///
diff --git a/src/Tgstation.Server.Host/Components/IInstance.cs b/src/Tgstation.Server.Host/Components/IInstance.cs
index d90826f9b4..299dbe6fc0 100644
--- a/src/Tgstation.Server.Host/Components/IInstance.cs
+++ b/src/Tgstation.Server.Host/Components/IInstance.cs
@@ -25,7 +25,7 @@ namespace Tgstation.Server.Host.Components
/// The for the
///
IByondManager ByondManager { get; }
-
+
///
/// The for the
///
@@ -37,7 +37,7 @@ namespace Tgstation.Server.Host.Components
IChat Chat { get; }
///
- /// The for the
+ /// The for the
///
IConfiguration Configuration { get; }
diff --git a/src/Tgstation.Server.Host/Components/Instance.cs b/src/Tgstation.Server.Host/Components/Instance.cs
index 18a50f6143..b3c289e4d5 100644
--- a/src/Tgstation.Server.Host/Components/Instance.cs
+++ b/src/Tgstation.Server.Host/Components/Instance.cs
@@ -27,9 +27,6 @@ namespace Tgstation.Server.Host.Components
///
public IByondManager ByondManager { get; }
- ///
- public IDreamMaker DreamMaker { get; }
-
///
public IWatchdog Watchdog { get; }
@@ -39,8 +36,15 @@ namespace Tgstation.Server.Host.Components
///
public StaticFiles.IConfiguration Configuration { get; }
- ///
- public ICompileJobConsumer CompileJobConsumer { get; }
+ ///
+ /// The for the
+ ///
+ readonly IDreamMaker dreamMaker;
+
+ ///
+ /// The for the
+ ///
+ readonly ICompileJobConsumer compileJobConsumer;
///
/// The for the
@@ -81,6 +85,7 @@ namespace Tgstation.Server.Host.Components
/// The auto update
///
Task timerTask;
+
///
/// for
///
@@ -92,11 +97,11 @@ namespace Tgstation.Server.Host.Components
/// The value of
/// The value of
/// The value of
- /// The value of
+ /// The value of
/// The value of
/// The value of
/// The value of
- /// The value of
+ /// The value of
/// The value of
/// The value of
/// The value of
@@ -108,11 +113,11 @@ namespace Tgstation.Server.Host.Components
this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
- DreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
+ this.dreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
Chat = chat ?? throw new ArgumentNullException(nameof(chat));
Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
- CompileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
+ this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
@@ -125,7 +130,7 @@ namespace Tgstation.Server.Host.Components
public void Dispose()
{
timerCts?.Dispose();
- CompileJobConsumer.Dispose();
+ compileJobConsumer.Dispose();
Configuration.Dispose();
Chat.Dispose();
Watchdog.Dispose();
@@ -135,9 +140,10 @@ namespace Tgstation.Server.Host.Components
///
public async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action progressReporter, CancellationToken cancellationToken)
{
- //DO NOT FOLLOW THE SUGGESTION FOR A THROW EXPRESSION HERE
+#pragma warning disable IDE0016 // Use 'throw' expression
if (job == null)
throw new ArgumentNullException(nameof(job));
+#pragma warning restore IDE0016 // Use 'throw' expression
if (databaseContext == null)
throw new ArgumentNullException(nameof(databaseContext));
if (progressReporter == null)
@@ -151,8 +157,6 @@ namespace Tgstation.Server.Host.Components
var compileJobsTask = databaseContext.CompileJobs
.Where(x => x.Job.Instance.Id == metadata.Id)
.OrderByDescending(x => x.Job.StoppedAt)
- //TODO: Replace with this select when the issues linked in https://github.com/tgstation/tgstation-server/issues/737 are fixed
- //.Select(x => x.Job.StoppedAt.Value - x.Job.StartedAt.Value)
.Select(x => new Job
{
StoppedAt = x.Job.StoppedAt,
@@ -206,7 +210,7 @@ namespace Tgstation.Server.Host.Components
logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
databaseContext.Instances.Attach(revInfo.Instance);
}
-
+
TimeSpan? averageSpan = null;
var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
if(previousCompileJobs.Count != 0)
@@ -217,14 +221,14 @@ namespace Tgstation.Server.Host.Components
averageSpan = totalSpan / previousCompileJobs.Count;
}
- compileJob = await DreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
+ compileJob = await dreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
}
compileJob.Job = job;
- databaseContext.CompileJobs.Add(compileJob); //will be saved by job context
-
- job.PostComplete = ct => CompileJobConsumer.LoadCompileJob(compileJob, ct);
+ databaseContext.CompileJobs.Add(compileJob); // will be saved by job context
+
+ job.PostComplete = ct => compileJobConsumer.LoadCompileJob(compileJob, ct);
if (repositorySettingsTask != null)
{
@@ -234,9 +238,9 @@ namespace Tgstation.Server.Host.Components
if (repositorySettings.AccessToken != null)
{
- //potential for commenting on a test merge change
+ // potential for commenting on a test merge change
var outgoingCompileJob = LatestCompileJob();
-
+
if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha)
{
var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
@@ -263,10 +267,9 @@ namespace Tgstation.Server.Host.Components
updated ? "Updated" : "Deployed",
metadata.Name,
compileJob.RevisionInformation.OriginCommitSha,
- compileJob.RevisionInformation.CommitSha
- );
+ compileJob.RevisionInformation.CommitSha);
- //added prs
+ // added prs
foreach (var I in compileJob
.RevisionInformation
.ActiveTestMerges
@@ -277,7 +280,7 @@ namespace Tgstation.Server.Host.Components
.Any(y => y.TestMerge.Number == x.Number)))
tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
- //removed prs
+ // removed prs
foreach (var I in outgoingCompileJob
.RevisionInformation
.ActiveTestMerges
@@ -288,7 +291,7 @@ namespace Tgstation.Server.Host.Components
.Any(y => y.TestMerge.Number == x.Number)))
tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
- //updated prs
+ // updated prs
foreach(var I in compileJob
.RevisionInformation
.ActiveTestMerges
@@ -341,11 +344,10 @@ namespace Tgstation.Server.Host.Components
{
var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
- //assume 5 steps with synchronize
+ // assume 5 steps with synchronize
const int ProgressSections = 7;
const int ProgressStep = 100 / ProgressSections;
-
const int NumSteps = 3;
var doneSteps = 0;
@@ -353,8 +355,8 @@ namespace Tgstation.Server.Host.Components
{
var tmpDoneSteps = doneSteps;
++doneSteps;
- return progress => progressReporter((progress + 100 * tmpDoneSteps) / NumSteps);
- };
+ return progress => progressReporter((progress + (100 * tmpDoneSteps)) / NumSteps);
+ }
using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
{
@@ -374,7 +376,7 @@ namespace Tgstation.Server.Host.Components
var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
- //the main point of auto update is to pull the remote
+ // the main point of auto update is to pull the remote
await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
RevisionInformation currentRevInfo = null;
@@ -415,7 +417,7 @@ namespace Tgstation.Server.Host.Components
hasDbChanges = true;
}
- //take appropriate auto update actions
+ // take appropriate auto update actions
bool shouldSyncTracked;
if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
{
@@ -459,7 +461,7 @@ namespace Tgstation.Server.Host.Components
shouldSyncTracked = true;
}
- //synch if necessary
+ // synch if necessary
if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
{
var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
@@ -498,7 +500,7 @@ namespace Tgstation.Server.Host.Components
continue;
}
- //finally set up the job
+ // finally set up the job
var compileProcessJob = new Job
{
StartedBy = user,
@@ -527,9 +529,10 @@ namespace Tgstation.Server.Host.Components
{
break;
}
+
logger.LogTrace("Leaving auto update loop...");
}
-
+
///
public void Rename(string newName)
{
@@ -541,9 +544,9 @@ namespace Tgstation.Server.Host.Components
///
public async Task StartAsync(CancellationToken cancellationToken)
{
- await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), CompileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
+ await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), compileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
- //dependent on so many things, its just safer this way
+ // dependent on so many things, its just safer this way
await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
CompileJob latestCompileJob = null;
@@ -555,7 +558,7 @@ namespace Tgstation.Server.Host.Components
}
///
- public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), CompileJobConsumer.StopAsync(cancellationToken));
+ public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), compileJobConsumer.StopAsync(cancellationToken));
///
public async Task SetAutoUpdateInterval(uint newInterval)
@@ -571,12 +574,13 @@ namespace Tgstation.Server.Host.Components
else
toWait = Task.CompletedTask;
}
+
await toWait.ConfigureAwait(false);
if (newInterval == 0)
return;
lock (this)
{
- //race condition, just quit
+ // race condition, just quit
if (timerTask != null)
return;
timerCts?.Dispose();
diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs
index b54cbc4d68..9841740c32 100644
--- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs
+++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs
@@ -154,10 +154,10 @@ namespace Tgstation.Server.Host.Components
///
public IInstance CreateInstance(Models.Instance metadata)
{
- //Create the ioManager for the instance
+ // Create the ioManager for the instance
var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
- //various other ioManagers
+ // various other ioManagers
var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
diff --git a/src/Tgstation.Server.Host/Components/InstanceManager.cs b/src/Tgstation.Server.Host/Components/InstanceManager.cs
index b9b558cba2..bad12f9a14 100644
--- a/src/Tgstation.Server.Host/Components/InstanceManager.cs
+++ b/src/Tgstation.Server.Host/Components/InstanceManager.cs
@@ -94,6 +94,7 @@ namespace Tgstation.Server.Host.Components
return;
disposed = true;
}
+
foreach (var I in instances)
I.Value.Dispose();
}
@@ -146,9 +147,10 @@ namespace Tgstation.Server.Host.Components
throw new InvalidOperationException("Instance not online!");
instances.Remove(metadata.Id);
}
+
try
{
- //we are the one responsible for cancelling his jobs
+ // we are the one responsible for cancelling his jobs
var tasks = new List();
await databaseContextFactory.UseContext(async db =>
{
@@ -194,6 +196,7 @@ namespace Tgstation.Server.Host.Components
instance.Dispose();
throw;
}
+
await instance.StartAsync(cancellationToken).ConfigureAwait(false);
}
@@ -236,7 +239,7 @@ namespace Tgstation.Server.Host.Components
await Task.WhenAll(instances.Select(x => x.Value.StopAsync(cancellationToken))).ConfigureAwait(false);
await instanceFactory.StopAsync(cancellationToken).ConfigureAwait(false);
- //downgrade the db if necessary
+ // downgrade the db if necessary
if (downgradeVersion != null)
await databaseContextFactory.UseContext(db => db.SchemaDowngradeForServerVersion(downgradeVersion, cancellationToken)).ConfigureAwait(false);
}
diff --git a/src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs b/src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs
index a8cc05feba..fbad20d56e 100644
--- a/src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs
+++ b/src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs
@@ -2,10 +2,24 @@
namespace Tgstation.Server.Host.Components.Interop
{
+ ///
+ /// Represents a chat command to be handled by DD
+ ///
sealed class ChatCommand
{
+ ///
+ /// The command name
+ ///
public string Command { get; set; }
+
+ ///
+ /// The command params
+ ///
public string Params { get; set; }
+
+ ///
+ /// The that sent the command
+ ///
public User User { get; set; }
}
}
diff --git a/src/Tgstation.Server.Host/Components/Interop/CommContext.cs b/src/Tgstation.Server.Host/Components/Interop/CommContext.cs
index e910ad7ffa..489053e91b 100644
--- a/src/Tgstation.Server.Host/Components/Interop/CommContext.cs
+++ b/src/Tgstation.Server.Host/Components/Interop/CommContext.cs
@@ -95,7 +95,7 @@ namespace Tgstation.Server.Host.Components.Interop
///
/// The sender of the event
/// The
- async void HandleWrite(object sender, FileSystemEventArgs e) //this is what async void was made for
+ async void HandleWrite(object sender, FileSystemEventArgs e) // this is what async void was made for
{
try
{
@@ -115,7 +115,7 @@ namespace Tgstation.Server.Host.Components.Interop
}
catch (JsonException ex)
{
- //file not fully written yet
+ // file not fully written yet
logger.LogDebug("Suppressing json convert exception for command file write: {0}", ex);
return;
}
diff --git a/src/Tgstation.Server.Host/Components/Interop/Constants.cs b/src/Tgstation.Server.Host/Components/Interop/Constants.cs
index 834a43063f..da5da51c91 100644
--- a/src/Tgstation.Server.Host/Components/Interop/Constants.cs
+++ b/src/Tgstation.Server.Host/Components/Interop/Constants.cs
@@ -1,31 +1,93 @@
namespace Tgstation.Server.Host.Components.Interop
{
+ ///
+ /// Constants used for communication with the DMAPI
+ ///
static class Constants
{
- //interop values, match them up with the appropriate api.dm
-
- //api version 4.0.0.0
+ ///
+ /// Identifies a TGS execution. The server version
+ ///
public const string DMParamHostVersion = "server_service_version";
+
+ ///
+ /// Path to the
+ ///
public const string DMParamInfoJson = "tgs_json";
+ ///
+ /// The
+ ///
public const string DMInteropAccessIdentifier = "tgs_tok";
+ ///
+ /// Generic OK response
+ ///
public const string DMResponseSuccess = "tgs_succ";
+ ///
+ /// Change port
+ ///
public const string DMTopicChangePort = "tgs_port";
+
+ ///
+ /// Change reboot mode
+ ///
public const string DMTopicChangeReboot = "tgs_rmode";
+
+ ///
+ /// Chat command
+ ///
public const string DMTopicChatCommand = "tgs_chat_comm";
+
+ ///
+ /// Notify of an
+ ///
public const string DMTopicEvent = "tgs_event";
+
+ ///
+ /// Response to an interop export from DM
+ ///
public const string DMTopicInteropResponse = "tgs_interop";
+ ///
+ /// Set port command
+ ///
public const string DMCommandNewPort = "tgs_new_port";
+
+ ///
+ /// API validation command
+ ///
public const string DMCommandApiValidate = "tgs_validate";
+
+ ///
+ /// Server primed command
+ ///
public const string DMCommandServerPrimed = "tgs_prime";
+
+ ///
+ /// World reboot command
+ ///
public const string DMCommandWorldReboot = "tgs_reboot";
+
+ ///
+ /// Terminate process command
+ ///
public const string DMCommandEndProcess = "tgs_kill";
+
+ ///
+ /// Chat send command
+ ///
public const string DMCommandChat = "tgs_chat_send";
+ ///
+ /// Topic command parameter
+ ///
public const string DMParameterCommand = "tgs_com";
+
+ ///
+ /// Command data
+ ///
public const string DMParameterData = "tgs_data";
}
}
diff --git a/src/Tgstation.Server.Host/Components/Repository/IRepository.cs b/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
index e993508172..44cb5b39db 100644
--- a/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
@@ -70,8 +70,8 @@ namespace Tgstation.Server.Host.Components.Repository
/// The e-mail of the merge committer
/// The username to fetch from the origin repository
/// The password to fetch from the origin repository
- /// The for the operation
/// to report 0-100 progress of the operation
+ /// The for the operation
/// A resulting in a representing the merge result that is after a fast forward or up to date, on a non-fast-forward, on a conflict
Task AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action progressReporter, CancellationToken cancellationToken);
@@ -119,8 +119,8 @@ namespace Tgstation.Server.Host.Components.Repository
/// The password to fetch from the origin repository
/// The name of the potential committer
/// The e-mail of the potential committer
- /// If the synchronizations should be made to the tracked reference as opposed to a temporary branch
/// to report 0-100 progress of the operation
+ /// If the synchronizations should be made to the tracked reference as opposed to a temporary branch
/// The for the operation
/// A resulting in if commits were pushed to the tracked origin reference, otherwise
Task Sychronize(string username, string password, string committerName, string committerEmail, Action progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken);
diff --git a/src/Tgstation.Server.Host/Components/Repository/Repository.cs b/src/Tgstation.Server.Host/Components/Repository/Repository.cs
index d9d0daaa8d..fe4cd5c8df 100644
--- a/src/Tgstation.Server.Host/Components/Repository/Repository.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/Repository.cs
@@ -84,27 +84,12 @@ namespace Tgstation.Server.Host.Components.Repository
///
readonly Action onDispose;
- void GetRepositoryOwnerName(string remote, out string owner, out string name)
- {
- //Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
- //Yes use .git twice in case it was weird
- var toRemove = new string[] { ".git", "/", ".git" };
- foreach (string item in toRemove)
- if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
- remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
- var splits = remote.Split('/');
- name = splits[splits.Length - 1];
- owner = splits[splits.Length - 2].Split('.')[0];
-
- logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
- }
-
///
/// Converts a given to a
///
/// to report 0-100 progress of the operation
/// A based on
- static CheckoutProgressHandler CheckoutProgressHandler(Action progressReporter) => (a, completedSteps, totalSteps) => progressReporter((int)((((float)completedSteps) / totalSteps) * 100));
+ static CheckoutProgressHandler CheckoutProgressHandler(Action progressReporter) => (a, completedSteps, totalSteps) => progressReporter((int)(((float)completedSteps) / totalSteps * 100));
///
/// Construct a
@@ -140,6 +125,21 @@ namespace Tgstation.Server.Host.Components.Repository
onDispose.Invoke();
}
+ void GetRepositoryOwnerName(string remote, out string owner, out string name)
+ {
+ // Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
+ // Yes use .git twice in case it was weird
+ var toRemove = new string[] { ".git", "/", ".git" };
+ foreach (string item in toRemove)
+ if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
+ remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
+ var splits = remote.Split('/');
+ name = splits[splits.Length - 1];
+ owner = splits[splits.Length - 2].Split('.')[0];
+
+ logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
+ }
+
///
/// Generate a standard set of
///
@@ -264,7 +264,7 @@ namespace Tgstation.Server.Host.Components.Repository
FailOnConflict = true,
FastForwardStrategy = FastForwardStrategy.NoFastForward,
SkipReuc = true,
- OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)((((float)completedSteps) / totalSteps) * 50)))
+ OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)(((float)completedSteps) / totalSteps * 50)))
});
}
finally
@@ -373,7 +373,7 @@ namespace Tgstation.Server.Host.Components.Repository
try
{
var forcePushString = String.Format(CultureInfo.InvariantCulture, "+{0}:{0}", branch.CanonicalName);
- repository.Network.Push(remote,forcePushString, GeneratePushOptions(progress => progressReporter((int)(0.9f * progress)), username, password, cancellationToken));
+ repository.Network.Push(remote, forcePushString, GeneratePushOptions(progress => progressReporter((int)(0.9f * progress)), username, password, cancellationToken));
var removalString = String.Format(CultureInfo.InvariantCulture, ":{0}", branch.CanonicalName);
repository.Network.Push(remote, removalString, GeneratePushOptions(progress => progressReporter(90 + (int)(0.1f * progress)), username, password, cancellationToken));
}
@@ -510,6 +510,7 @@ namespace Tgstation.Server.Host.Components.Repository
logger.LogTrace("Not synchronizing due to lack of credentials!");
return false;
}
+
logger.LogTrace("Begin Synchronize...");
if (username == null)
@@ -596,16 +597,18 @@ namespace Tgstation.Server.Host.Components.Repository
///
public Task IsSha(string committish, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
{
- //check if it's a tag
+ // check if it's a tag
var gitObject = repository.Lookup(committish, ObjectType.Tag);
if (gitObject != null)
return false;
cancellationToken.ThrowIfCancellationRequested();
- //check if it's a branch
+
+ // check if it's a branch
if (repository.Branches[committish] != null)
return false;
cancellationToken.ThrowIfCancellationRequested();
- //err on the side of references, if we can't look it up, assume its a reference
+
+ // err on the side of references, if we can't look it up, assume its a reference
if (repository.Lookup(committish) != null)
return true;
return false;
diff --git a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
index 2ec1c57468..4feeb46897 100644
--- a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
@@ -95,6 +95,7 @@ namespace Tgstation.Server.Host.Components.Repository
throw new InvalidOperationException("The repository is already being cloned!");
CloneInProgress = true;
}
+
try
{
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
@@ -139,6 +140,7 @@ namespace Tgstation.Server.Host.Components.Repository
{
logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
}
+
throw;
}
else
@@ -147,12 +149,14 @@ namespace Tgstation.Server.Host.Components.Repository
return null;
}
}
+
logger.LogInformation("Clone complete!");
}
finally
{
CloneInProgress = false;
}
+
return await LoadRepository(cancellationToken).ConfigureAwait(false);
}
@@ -188,6 +192,7 @@ namespace Tgstation.Server.Host.Components.Repository
semaphore.Release();
return null;
}
+
return new Repository(repo, ioManager, eventConsumer, credentialsProvider, repositoryLogger, () =>
{
logger.LogTrace("Releasing semaphore due to Repository disposal...");
diff --git a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
index f7a6436e22..4211761fed 100644
--- a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
+++ b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
@@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
-using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
@@ -131,12 +130,11 @@ namespace Tgstation.Server.Host.Components.StaticFiles
///
public async Task CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)
{
-
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
{
await EnsureDirectories(cancellationToken).ConfigureAwait(false);
- //just assume no other fs race conditions here
+ // just assume no other fs race conditions here
var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken);
var headFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsHeadFile), cancellationToken);
var tailFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsTailFile), cancellationToken);
@@ -154,7 +152,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
return null;
string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath);
-
+
return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false);
}
}
@@ -168,7 +166,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
configurationRelativePath = '.' + configurationRelativePath;
var resolved = ioManager.ResolvePath(configurationRelativePath);
var local = !nullOrEmptyCheck ? ioManager.ResolvePath(".") : null;
- if (!nullOrEmptyCheck && resolved.Length < local.Length) //.. fuccbois
+ if (!nullOrEmptyCheck && resolved.Length < local.Length) // .. fuccbois
throw new InvalidOperationException("Attempted to access file outside of configuration manager!");
return resolved;
}
@@ -201,6 +199,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
result = null;
return;
}
+
enumerator = synchronousIOManager.GetFiles(path, cancellationToken);
result.AddRange(enumerator.Select(x => new ConfigurationFile
{
@@ -236,7 +235,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
#pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
using (var sha1 = new SHA1Managed())
#pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
- sha1String = String.Join("", sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
+ sha1String = String.Join(String.Empty, sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
result = new ConfigurationFile
{
Content = content,
@@ -248,7 +247,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
}
catch (UnauthorizedAccessException)
{
- //this happens on windows, dunno about linux
+ // this happens on windows, dunno about linux
bool isDirectory;
try
{
@@ -289,7 +288,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
var results = new List { StaticIgnoreFile };
- //we don't want to lose trailing whitespace on linux
+ // we don't want to lose trailing whitespace on linux
using (var reader = new StringReader(ignoreFileText))
{
cancellationToken.ThrowIfCancellationRequested();
@@ -299,7 +298,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
}
return results;
- };
+ }
IReadOnlyList ignoreFiles;
@@ -316,9 +315,9 @@ namespace Tgstation.Server.Host.Components.StaticFiles
{
var fileName = ioManager.GetFileName(x);
+ // need to normalize
bool ignored;
if (platformIdentifier.IsWindows)
- //need to normalize
ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
else
ignored = ignoreFiles.Any(y => fileName == y);
@@ -367,7 +366,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
if (!success)
return;
if (data != null)
- postWriteHandler.HandleWrite(path);
+ postWriteHandler.HandleWrite(path);
result = new ConfigurationFile
{
Content = data,
@@ -379,7 +378,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
}
catch (UnauthorizedAccessException)
{
- //this happens on windows, dunno about linux
+ // this happens on windows, dunno about linux
bool isDirectory;
try
{
@@ -442,7 +441,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
if (!EventTypeScriptFileNameMap.TryGetValue(eventType, out var scriptName))
return true;
- //always execute in serial
+ // always execute in serial
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
{
var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
@@ -458,6 +457,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
return false;
}
}
+
return true;
}
@@ -466,7 +466,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
{
await EnsureDirectories(cancellationToken).ConfigureAwait(false);
var path = ValidateConfigRelativePath(configurationRelativePath);
-
+
var result = false;
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
{
@@ -477,6 +477,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
else
CheckDeleteImpl();
}
+
return result;
}
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs b/src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs
index 46e282802d..f830edb59e 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs
@@ -9,22 +9,27 @@
/// The DMAPI never contacted the server for validation
///
NeverValidated,
+
///
/// The server was contacted for validation but it was never requested
///
UnaskedValidationRequest,
+
///
/// The validation request was malformed
///
BadValidationRequest,
+
///
/// Valid API. The game must be run with a minimum security level of
///
RequiresSafe,
+
///
/// Valid API. The game must be run with a security level of
///
RequiresTrusted,
+
///
/// Valid API. The game must be run with a minimum security level of
///
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs b/src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs
index c310f18d65..61a8a7cfc2 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs
@@ -72,6 +72,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
return;
disposed = true;
}
+
Dmb.Dispose();
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs b/src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs
index bf343bbced..306bdccc40 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs
@@ -9,18 +9,22 @@
/// The monitor should continue as normal
///
Continue,
+
///
- /// Skips the next call to HandleMonitorWakeup action
+ /// Skips the next call to HandleMonitorWakeup action
///
Skip,
+
///
/// The monitor should kill and restart both servers
///
Restart,
+
///
/// The monitor should stop checking actions for this iteration and continue its loop
///
Break,
+
///
/// The monitor should exit. Does not kill servers
///
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs b/src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs
index 8a3d842dca..2863028238 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs
@@ -9,26 +9,32 @@
/// The active server crashed or exited
///
ActiveServerCrashed,
+
///
/// The inactive server crashed or exited
///
InactiveServerCrashed,
+
///
/// The active server called /world/Reboot()
///
ActiveServerRebooted,
+
///
/// The inactive server called /world/Reboot()
///
InactiveServerRebooted,
+
///
/// The inactive server is past that point where DD hangs when you press "Go"
///
InactiveServerStartupComplete,
+
///
/// A new .dmb was deployed
///
NewDmbAvailable,
+
///
/// Server launch parameters were changed
///
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs b/src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs
index f12cfbc7b9..e69e8a360b 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs
@@ -2,11 +2,13 @@
namespace Tgstation.Server.Host.Components.Watchdog
{
- //POSIX BYOND doesn't prompt you when you change the port
///
sealed class PosixNetworkPromptReaper : INetworkPromptReaper
{
///
- public void RegisterProcess(IProcess process) { }
+ public void RegisterProcess(IProcess process)
+ {
+ // POSIX BYOND doesn't prompt you when you change the port
+ }
}
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs b/src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs
index 70b4dac3f5..0dbc6e95aa 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs
@@ -9,10 +9,12 @@
/// Run DreamDaemon's normal reboot process
///
Normal = 0,
+
///
/// Shutdown DreamDaemon
///
Shutdown = 1,
+
///
/// Restart the DreamDaemon process
///
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
index d8fa568f03..6f6c6ac679 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
@@ -136,6 +136,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// The waits on when DreamDaemon currently has it's ports closed
///
TaskCompletionSource portAssignmentTcs;
+
///
/// The port to assign DreamDaemon when it queries for it
///
@@ -181,7 +182,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// The optional time to wait before failing the
public SessionController(ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)
{
- this.chatJsonTrackingContext = chatJsonTrackingContext; //null valid
+ this.chatJsonTrackingContext = chatJsonTrackingContext; // null valid
this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation));
this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
this.process = process ?? throw new ArgumentNullException(nameof(process));
@@ -219,17 +220,18 @@ namespace Tgstation.Server.Host.Components.Watchdog
StartupTime = process.Startup.IsCompleted ? (TimeSpan?)(DateTimeOffset.Now - startTime) : null
};
return result;
- };
+ }
+
LaunchResult = GetLaunchResult();
logger.LogDebug("Created session controller. Primary: {0}, CommsKey: {1}, Port: {2}", IsPrimary, reattachInformation.AccessIdentifier, Port);
}
///
- /// Finalize the
+ /// Finalizes an instance of the class.
///
/// The finalizer dispose pattern is necessary so we don't accidentally leak the executable
-#pragma warning disable CA1821 // Remove empty Finalizers //TODO remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
+#pragma warning disable CA1821 // Remove empty Finalizers TODO: remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
~SessionController() => Dispose(false);
#pragma warning restore CA1821 // Remove empty Finalizers
@@ -240,7 +242,10 @@ namespace Tgstation.Server.Host.Components.Watchdog
GC.SuppressFinalize(this);
}
- ///
+ ///
+ /// Implements the pattern
+ ///
+ /// If this function was NOT called by the finalizer
void Dispose(bool disposing)
{
lock (this)
@@ -254,9 +259,10 @@ namespace Tgstation.Server.Host.Components.Watchdog
process.Terminate();
byondLock.Dispose();
}
+
process.Dispose();
interopContext.Dispose();
- Dmb?.Dispose(); //will be null when released
+ Dmb?.Dispose(); // will be null when released
chatJsonTrackingContext.Dispose();
disposed = true;
}
@@ -307,9 +313,10 @@ namespace Tgstation.Server.Host.Components.Watchdog
logger.LogDebug("Exception while decoding chat message! Exception: {0}", e);
goto default;
}
+
break;
case Constants.DMCommandServerPrimed:
- //currently unused, maybe in the future
+ // currently unused, maybe in the future
break;
case Constants.DMCommandEndProcess:
TerminationWasRequested = true;
@@ -327,18 +334,17 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
if (!nextPort.HasValue)
- //not ready yet, so what we'll do is accept the random port DD opened on for now and change it later when we decide to
- reattachInformation.Port = currentPort;
+ reattachInformation.Port = currentPort; // not ready yet, so what we'll do is accept the random port DD opened on for now and change it later when we decide to
else
{
- //nextPort is ready, tell DD to switch to that
- //if it fails it'll kill itself
+ // nextPort is ready, tell DD to switch to that
+ // if it fails it'll kill itself
content = new Dictionary { { Constants.DMParameterData, nextPort.Value } };
reattachInformation.Port = nextPort.Value;
overrideResponsePort = currentPort;
nextPort = null;
- //we'll also get here from SetPort so complete that task
+ // we'll also get here from SetPort so complete that task
var tmpTcs = portAssignmentTcs;
portAssignmentTcs = null;
if (tmpTcs != null)
@@ -347,6 +353,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
portClosedForReboot = false;
}
+
break;
case Constants.DMCommandApiValidate:
if (!launchSecurityLevel.HasValue)
@@ -356,6 +363,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
content = new ErrorMessage { Message = "Invalid API validation request!" };
break;
}
+
if (!query.TryGetValue(Constants.DMParameterData, out var stringMinimumSecurityLevelObject) || !Enum.TryParse(stringMinimumSecurityLevelObject as string, out var minimumSecurityLevel))
apiValidationStatus = ApiValidationStatus.BadValidationRequest;
else
@@ -373,6 +381,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
default:
throw new InvalidOperationException("Enum.TryParse failed to validate the DreamDaemonSecurity range!");
}
+
break;
case Constants.DMCommandWorldReboot:
if (ClosePortOnReboot)
@@ -381,6 +390,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
content = new Dictionary { { Constants.DMParameterData, 0 } };
portClosedForReboot = true;
}
+
var oldTcs = rebootTcs;
rebootTcs = new TaskCompletionSource