Files
tgstation-server/_instance_controller_8cs_source.html
T

184 lines
150 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceController.cs Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="tgs.ico"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">tgstation-server
&#160;<span id="projectnumber">4.3.2</span>
</div>
<div id="projectbrief">The /tg/station 13 server suite</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="features.html"><span>Features</span></a></li>
<li><a href="api.html"><span>API</span></a></li>
<li><a href="architecture.html"><span>Architecture</span></a></li>
<li><a href="namespaces.html"><span>Packages</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_34761767c1c3cd212f9d2f80ea0828a8.html">Tgstation.Server.Host</a></li><li class="navelem"><a class="el" href="dir_38cec1532eaed7aa1de0b599a76e3e80.html">Controllers</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">InstanceController.cs</div> </div>
</div><!--header-->
<div class="contents">
<a href="_instance_controller_8cs.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="keyword">using</span> Microsoft.AspNetCore.Mvc;</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="keyword">using</span> Microsoft.EntityFrameworkCore;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="keyword">using</span> Microsoft.Extensions.Logging;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="keyword">using</span> Microsoft.Extensions.Options;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Collections.Generic;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Globalization;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.IO;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Linq;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Linq.Expressions;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Net;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Reflection;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Threading;</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_system.html">System</a>.Threading.Tasks;</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api.html">Api</a>;</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api.html">Api</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html">Models</a>;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api.html">Api</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html">Rights</a>;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_components.html">Components</a>;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html">Configuration</a>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_database.html">Database</a>;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html">IO</a>;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_jobs.html">Jobs</a>;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_models.html">Models</a>;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_security.html">Security</a>;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">using</span> <a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server.html">Server</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host.html">Host</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_host_1_1_system.html">System</a>;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespace_tgstation.html">Tgstation</a>.<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba9aa1b03934893d7134a660af4204f2a9">Server</a>.Host.Controllers</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;{</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; [Route(<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_routes.html">Routes</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_routes.html#a17bfc22b8cbc4624a6ec180aeba91da8">InstanceManager</a>)]</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor"> #pragma warning disable CA1506 // TODO: Decomplexify</span></div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html"> 34</a></span>&#160; <span class="keyword">public</span> sealed <span class="keyword">class </span><a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html">InstanceController</a> : <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html">ApiController</a></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; {</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa40d55750e2193d714eb1470505c47ee"> 39</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">string</span> InstanceAttachFileName = <span class="stringliteral">&quot;TGS4_ALLOW_INSTANCE_ATTACH&quot;</span>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a05f43b931e38b2d401566435d5a3de75"> 41</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">string</span> MoveInstanceJobPrefix = <span class="stringliteral">&quot;Move instance ID &quot;</span>;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34"> 46</a></span>&#160; readonly <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_jobs_1_1_i_job_manager.html">IJobManager</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34">jobManager</a>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad177b6d13a08c429c49b7e4294387d3c"> 51</a></span>&#160; readonly <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html">IInstanceManager</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad177b6d13a08c429c49b7e4294387d3c">instanceManager</a>;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#afb2e4e54c38a97b299d1fb7692cc5cdd"> 56</a></span>&#160; readonly <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html">IIOManager</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#afb2e4e54c38a97b299d1fb7692cc5cdd">ioManager</a>;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aeb5ae966710833c1841de51f73cb2362"> 61</a></span>&#160; readonly <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_assembly_information_provider.html">IAssemblyInformationProvider</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aeb5ae966710833c1841de51f73cb2362">assemblyInformationProvider</a>;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ac62c0b1b0e346409b20c3054d4a8354a"> 66</a></span>&#160; readonly <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_platform_identifier.html">IPlatformIdentifier</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ac62c0b1b0e346409b20c3054d4a8354a">platformIdentifier</a>;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a4f60f72c082a222a31383dbfceb755a6"> 71</a></span>&#160; readonly <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html">GeneralConfiguration</a> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a4f60f72c082a222a31383dbfceb755a6">generalConfiguration</a>;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#addd1307d3fea6368330400f6927ee701"> 85</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#addd1307d3fea6368330400f6927ee701">InstanceController</a>(</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_database_1_1_i_database_context.html">IDatabaseContext</a> databaseContext,</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html">IAuthenticationContextFactory</a> authenticationContextFactory,</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_jobs_1_1_i_job_manager.html">IJobManager</a> jobManager,</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html">IInstanceManager</a> instanceManager,</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html">IIOManager</a> ioManager,</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_assembly_information_provider.html">IAssemblyInformationProvider</a> assemblyInformationProvider,</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <a class="code" href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_platform_identifier.html">IPlatformIdentifier</a> platformIdentifier,</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; IOptions&lt;GeneralConfiguration&gt; generalConfigurationOptions,</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; ILogger&lt;InstanceController&gt; logger)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; : base(databaseContext, authenticationContextFactory, logger, false, true)</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; {</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; this.jobManager = jobManager ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(jobManager));</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; this.instanceManager = instanceManager ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(instanceManager));</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; this.ioManager = ioManager ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(ioManager));</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; this.assemblyInformationProvider = assemblyInformationProvider ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(assemblyInformationProvider));</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; this.platformIdentifier = platformIdentifier ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(platformIdentifier));</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; generalConfiguration = generalConfigurationOptions?.Value ?? <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(generalConfigurationOptions));</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8b8a858eef2c16d29e1aff3603f91cce"> 105</a></span>&#160; <span class="keywordtype">string</span> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8b8a858eef2c16d29e1aff3603f91cce">NormalizePath</a>(<span class="keywordtype">string</span> path)</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; {</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">if</span> (path == null)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">return</span> null;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; path = ioManager.ResolvePath(path);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">if</span> (platformIdentifier.IsWindows)</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; path = path.ToUpperInvariant().Replace(<span class="charliteral">&#39;\\&#39;</span>, <span class="charliteral">&#39;/&#39;</span>);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">return</span> path;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; Models.InstanceUser InstanceAdminUser() =&gt; <span class="keyword">new</span> Models.InstanceUser</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9">ByondRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9">ByondRights</a>)~0U,</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72">ChatBotRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72">ChatBotRights</a>)~0U,</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c">ConfigurationRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c">ConfigurationRights</a>)~0U,</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49">DreamDaemonRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49">DreamDaemonRights</a>)~0U,</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d">DreamMakerRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d">DreamMakerRights</a>)~0U,</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39">RepositoryRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39">RepositoryRights</a>)~0U,</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">InstanceUserRights</a> = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">InstanceUserRights</a>)~0U,</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; UserId = <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f">Id</a></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; };</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; [HttpPut]</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; [TgsAuthorize(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Create)]</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; [ProducesResponseType(typeof(Api.Models.Instance), 200)]</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; [ProducesResponseType(typeof(Api.Models.Instance), 201)]</div><div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8712ba6603139064d68520e16c076901"> 141</a></span>&#160; <span class="keyword">public</span> async Task&lt;IActionResult&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8712ba6603139064d68520e16c076901">Create</a>([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; {</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">if</span> (model == null)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(model));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">if</span> (String.IsNullOrWhiteSpace(model.Name))</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">return</span> BadRequest(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceWhitespaceName));</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; var targetInstancePath = NormalizePath(model.Path);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; model.Path = targetInstancePath;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; var installationDirectoryPath = NormalizePath(<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html">DefaultIOManager</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a984a32ee93a073036f63d543ad9a6cdd">CurrentDirectory</a>);</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordtype">bool</span> InstanceIsChildOf(<span class="keywordtype">string</span> otherPath)</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; {</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">if</span> (!targetInstancePath.StartsWith(otherPath, StringComparison.Ordinal))</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordtype">bool</span> sameLength = targetInstancePath.Length == otherPath.Length;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordtype">char</span> dirSeparatorChar = targetInstancePath.ToCharArray()[Math.Min(otherPath.Length, targetInstancePath.Length - 1)];</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">return</span> sameLength</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; || dirSeparatorChar == Path.DirectorySeparatorChar</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; || dirSeparatorChar == Path.AltDirectorySeparatorChar;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keywordflow">if</span> (InstanceIsChildOf(installationDirectoryPath))</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceAtConflictingPath));</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">// Validate it&#39;s not a child of any other instance</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; IActionResult earlyOut = null;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; ulong countOfOtherInstances = 0;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">using</span> (var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; var newCancellationToken = cts.Token;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">try</span></div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; .<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a></div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; .AsQueryable()</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; .Select(x =&gt; <span class="keyword">new</span> Models.Instance</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; Path = x.Path</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; })</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; .ForEachAsync(</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; otherInstance =&gt;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">if</span> (++countOfOtherInstances &gt;= generalConfiguration.InstanceLimit)</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; earlyOut ??= Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceLimitReached));</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordflow">else</span> if (InstanceIsChildOf(otherInstance.Path))</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; earlyOut ??= Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceAtConflictingPath));</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; if (earlyOut != null &amp;&amp; !newCancellationToken.IsCancellationRequested)</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; cts.Cancel();</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; },</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; newCancellationToken)</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">catch</span> (OperationCanceledException)</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; cancellationToken.ThrowIfCancellationRequested();</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; }</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">if</span> (earlyOut != null)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">return</span> earlyOut;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// Last test, ensure it&#39;s in the list of valid paths</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">if</span> (!(generalConfiguration.ValidInstancePaths?</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; .Select(path =&gt; NormalizePath(path))</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; .Any(path =&gt; InstanceIsChildOf(path)) ?? <span class="keyword">true</span>))</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">return</span> BadRequest(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceNotAtWhitelistedPath));</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; async Task&lt;bool&gt; DirExistsAndIsNotEmpty()</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; {</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">if</span> (!await ioManager.DirectoryExists(model.Path, cancellationToken).ConfigureAwait(<span class="keyword">false</span>))</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; var filesTask = ioManager.GetFiles(model.Path, cancellationToken);</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; var dirsTask = ioManager.GetDirectories(model.Path, cancellationToken);</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; var files = await filesTask.ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; var dirs = await dirsTask.ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> files.Concat(dirs).Any();</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; var dirExistsTask = DirExistsAndIsNotEmpty();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordtype">bool</span> attached = <span class="keyword">false</span>;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">if</span> (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(<span class="keyword">false</span>) || await dirExistsTask.ConfigureAwait(<span class="keyword">false</span>))</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(<span class="keyword">false</span>))</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceAtExistingPath));</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; attached = <span class="keyword">true</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; var newInstance = <span class="keyword">new</span> Models.Instance</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440">ConfigurationType</a> = model.ConfigurationType ?? <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440">ConfigurationType</a>.Disallowed,</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html">DreamDaemonSettings</a> = <span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html">DreamDaemonSettings</a></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; AllowWebClient = <span class="keyword">false</span>,</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; AutoStart = <span class="keyword">false</span>,</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; PrimaryPort = 1337,</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; SecondaryPort = 1338,</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; SecurityLevel = <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5">DreamDaemonSecurity</a>.Safe,</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; StartupTimeout = 60,</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; HeartbeatSeconds = 60</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; },</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html">DreamMakerSettings</a> = <span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html">DreamMakerSettings</a></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; {</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; ApiValidationPort = 1339,</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; ApiValidationSecurityLevel = <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5">DreamDaemonSecurity</a>.Safe</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; },</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; Name = model.Name,</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; Online = <span class="keyword">false</span>,</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; Path = model.Path,</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; AutoUpdateInterval = model.AutoUpdateInterval ?? 0,</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; ChatBotLimit = model.ChatBotLimit ?? Models.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a7d310dcc01986cdbfb6bb41d1f80825d">Instance</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a6e95c489b01ba0ca06a8a803e2df9b9f">DefaultChatBotLimit</a>,</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html">RepositorySettings</a> = <span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html">RepositorySettings</a></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; {</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; CommitterEmail = <span class="stringliteral">&quot;tgstation-server@users.noreply.github.com&quot;</span>,</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; CommitterName = assemblyInformationProvider.VersionPrefix,</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; PushTestMergeCommits = <span class="keyword">false</span>,</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; ShowTestMergeCommitters = <span class="keyword">false</span>,</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; AutoUpdatesKeepTestMerges = <span class="keyword">false</span>,</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; AutoUpdatesSynchronize = <span class="keyword">false</span>,</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; PostTestMergeComment = <span class="keyword">false</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; },</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; InstanceUsers = <span class="keyword">new</span> <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca4ee29ca12c7d126654bd0e5275de6135">List</a>&lt;Models.InstanceUser&gt; <span class="comment">// give this user full privileges on the instance</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; InstanceAdminUser()</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; }</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; };</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a>.Add(newInstance);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">try</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; {</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Save</a>(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">try</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; {</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="comment">// actually reserve it now</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; await ioManager.CreateDirectory(targetInstancePath, cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; await ioManager.DeleteFile(ioManager.ConcatPath(targetInstancePath, InstanceAttachFileName), cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; }</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">catch</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="comment">// oh shit delete the model</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a>.Remove(newInstance);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Save</a>(<span class="keywordflow">default</span>).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordflow">throw</span>;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">catch</span> (IOException e)</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; {</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.IOError)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; AdditionalData = e.Message</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; });</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; Logger.LogInformation(<span class="stringliteral">&quot;{0} {1} instance {2}: {3} ({4})&quot;</span>, <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#aef98c54b24b4d1133ea761784699c360">Name</a>, attached ? <span class="stringliteral">&quot;attached&quot;</span> : <span class="stringliteral">&quot;created&quot;</span>, newInstance.Name, newInstance.Id, newInstance.Path);</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; var api = newInstance.ToApi();</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">return</span> attached ? (IActionResult)Json(api) : StatusCode((<span class="keywordtype">int</span>)HttpStatusCode.Created, api);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; [HttpDelete(<span class="stringliteral">&quot;{id}&quot;</span>)]</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; [TgsAuthorize(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Delete)]</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; [ProducesResponseType(204)]</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; [ProducesResponseType(410)]</div><div class="line"><a name="l00320"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a14134d386ac311c0f7a76b7ef312a2d6"> 320</a></span>&#160; <span class="keyword">public</span> async Task&lt;IActionResult&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a14134d386ac311c0f7a76b7ef312a2d6">Delete</a>(<span class="keywordtype">long</span> <span class="keywordtype">id</span>, CancellationToken cancellationToken)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; {</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; var originalModel = await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; .<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; .AsQueryable()</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; .Where(x =&gt; x.Id == <span class="keywordtype">id</span>)</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; .Include(x =&gt; x.WatchdogReattachInformation)</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; .Include(x =&gt; x.WatchdogReattachInformation.Alpha)</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; .Include(x =&gt; x.WatchdogReattachInformation.Bravo)</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">if</span> (originalModel == <span class="keywordflow">default</span>)</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">return</span> StatusCode((<span class="keywordtype">int</span>)HttpStatusCode.Gone);</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (originalModel.Online.Value)</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceDetachOnline));</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">if</span> (originalModel.WatchdogReattachInformation != null)</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; {</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ae3acd0395152260e6a94c0e47dc72e85">WatchdogReattachInformations</a>.Remove(originalModel.WatchdogReattachInformation);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordflow">if</span> (originalModel.WatchdogReattachInformation.Alpha != null)</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a013e9ece5b0c1f83eb7eb891a8e09489">ReattachInformations</a>.Remove(originalModel.WatchdogReattachInformation.Alpha);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">if</span> (originalModel.WatchdogReattachInformation.Bravo != null)</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a013e9ece5b0c1f83eb7eb891a8e09489">ReattachInformations</a>.Remove(originalModel.WatchdogReattachInformation.Bravo);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a>.Remove(originalModel);</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; await ioManager.WriteAllBytes(attachFileName, Array.Empty&lt;byte&gt;(), <span class="keywordflow">default</span>).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Save</a>(cancellationToken).ConfigureAwait(<span class="keyword">false</span>); <span class="comment">// cascades everything</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> NoContent();</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; [HttpPost]</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; [TgsAuthorize(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Relocate | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Rename | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetAutoUpdate | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetConfiguration | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetOnline | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetChatBotLimit)]</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; [ProducesResponseType(typeof(Api.Models.Instance), 200)]</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; [ProducesResponseType(typeof(Api.Models.Instance), 202)]</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; [ProducesResponseType(410)]</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160;<span class="preprocessor">#pragma warning disable CA1502 // TODO: Decomplexify</span></div><div class="line"><a name="l00366"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad31a819fbeeca3ebd71d35892ce10b19"> 366</a></span>&#160; <span class="keyword">public</span> async Task&lt;IActionResult&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad31a819fbeeca3ebd71d35892ce10b19">Update</a>([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (model == null)</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentNullException(nameof(model));</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <a class="code" href="class_i_queryable.html">IQueryable</a>&lt;Models.Instance&gt; InstanceQuery() =&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; .<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; .AsQueryable()</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; .Where(x =&gt; x.Id == model.Id);</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; var moveJob = await InstanceQuery()</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; .SelectMany(x =&gt; x.Jobs).</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;#pragma warning disable CA1307 <span class="comment">// Specify StringComparison</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; Where(x =&gt; !x.StoppedAt.HasValue &amp;&amp; x.Description.StartsWith(MoveInstanceJobPrefix))</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;#pragma warning restore CA1307 <span class="comment">// Specify StringComparison</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; .Select(x =&gt; <span class="keyword">new</span> Models.Job</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; Id = x.Id</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">if</span> (moveJob != <span class="keywordflow">default</span>)</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; await jobManager.CancelJob(moveJob, <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>, <span class="keyword">true</span>, cancellationToken).ConfigureAwait(<span class="keyword">false</span>); <span class="comment">// cancel it now</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; var originalModel = await InstanceQuery()</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; .Include(x =&gt; x.RepositorySettings)</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; .Include(x =&gt; x.ChatSettings)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; .ThenInclude(x =&gt; x.Channels)</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; .Include(x =&gt; x.DreamDaemonSettings) <span class="comment">// need these for onlining</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">if</span> (originalModel == <span class="keywordflow">default</span>(Models.Instance))</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">return</span> StatusCode((<span class="keywordtype">int</span>)HttpStatusCode.Gone);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; var userRights = (<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>)<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#ade8aeb7dd0a0e480f6f89bd5973703c7">GetRight</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20">RightsType</a>.InstanceManager);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordtype">bool</span> CheckModified&lt;T&gt;(Expression&lt;Func&lt;Api.Models.Instance, T&gt;&gt; expression, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a> requiredRight)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; var memberSelectorExpression = (MemberExpression)expression.Body;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; var property = (PropertyInfo)memberSelectorExpression.Member;</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; var newVal = <span class="keyword">property</span>.GetValue(model);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">if</span> (newVal == null)</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (!userRights.HasFlag(requiredRight) &amp;&amp; <span class="keyword">property</span>.GetValue(originalModel) != newVal)</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keyword">property</span>.SetValue(originalModel, newVal);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordtype">string</span> originalModelPath = null;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordtype">string</span> rawPath = null;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keywordflow">if</span> (model.Path != null)</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; {</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; rawPath = NormalizePath(model.Path);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">if</span> (model.Path != originalModel.Path)</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">if</span> (!userRights.HasFlag(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Relocate))</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordflow">return</span> Forbid();</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordflow">if</span> (originalModel.Online.Value &amp;&amp; model.Online != <span class="keyword">true</span>)</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceRelocateOnline));</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">if</span> (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(<span class="keyword">false</span>) || await dirExistsTask.ConfigureAwait(<span class="keyword">false</span>))</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.InstanceAtExistingPath));</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; originalModelPath = originalModel.Path;</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; originalModel.Path = model.Path;</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; var originalOnline = originalModel.Online.Value;</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; var renamed = model.Name != null &amp;&amp; originalModel.Name != model.Name;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">if</span> (CheckModified(x =&gt; x.AutoUpdateInterval, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetAutoUpdate)</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; || CheckModified(x =&gt; x.ConfigurationType, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetConfiguration)</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; || CheckModified(x =&gt; x.Name, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Rename)</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; || CheckModified(x =&gt; x.Online, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetOnline)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; || CheckModified(x =&gt; x.ChatBotLimit, <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.SetChatBotLimit))</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">return</span> Forbid();</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (model.ChatBotLimit.HasValue)</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; var countOfExistingChatBots = await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a></div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; .<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ad4cf2228c8dae3c2641251070fee76af">ChatBots</a></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; .AsQueryable()</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; .Where(x =&gt; x.InstanceId == originalModel.Id)</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; .CountAsync(cancellationToken)</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">if</span> (countOfExistingChatBots &gt; model.ChatBotLimit.Value)</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordflow">return</span> Conflict(<span class="keyword">new</span> <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">ErrorMessage</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">ErrorCode</a>.ChatBotMax));</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// ensure the current user has write privilege on the instance</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; var usersInstanceUser = await InstanceQuery()</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; .SelectMany(x =&gt; x.InstanceUsers)</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; .Where(x =&gt; x.UserId == <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f">Id</a>)</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; .FirstOrDefaultAsync(cancellationToken)</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordflow">if</span> (usersInstanceUser == <span class="keywordflow">default</span>)</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; var instanceAdminUser = InstanceAdminUser();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; instanceAdminUser.InstanceId = originalModel.Id;</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a67a792509733c253bc1a9e45bdf7fb1b">InstanceUsers</a>.Add(instanceAdminUser);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; }</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; usersInstanceUser.InstanceUserRights |= <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">InstanceUserRights</a>.WriteUsers;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Save</a>(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordflow">if</span> (renamed)</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; await instanceManager.GetInstance(originalModel).InstanceRenamed(originalModel.Name, cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">try</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">if</span> (originalOnline &amp;&amp; model.Online == <span class="keyword">false</span>)</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; await instanceManager.OfflineInstance(originalModel, <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>, cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!originalOnline &amp;&amp; model.Online == <span class="keyword">true</span>)</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// force autostart false here because we don&#39;t want any long running jobs right now</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="comment">// remember to document this</span></div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; originalModel.DreamDaemonSettings.AutoStart = <span class="keyword">false</span>;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordflow">catch</span> (Exception e)</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="keywordflow">if</span>(!(e is OperationCanceledException))</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; Logger.LogError(<span class="stringliteral">&quot;Error changing instance online state! Exception: {0}&quot;</span>, e);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; originalModel.Online = originalOnline;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">if</span> (originalModelPath != null)</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; originalModel.Path = originalModelPath;</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; await <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Save</a>(<span class="keywordflow">default</span>).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">throw</span>;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; }</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; var api = (<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#ade8aeb7dd0a0e480f6f89bd5973703c7">GetRight</a>(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20">RightsType</a>.InstanceManager) &amp; (ulong)<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Read) != 0 ? originalModel.ToApi() : <span class="keyword">new</span> Api.Models.Instance</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; Id = originalModel.Id</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; };</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; var moving = originalModelPath != null;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">if</span> (moving)</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; {</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; var job = <span class="keyword">new</span> Models.Job</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; {</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + <span class="stringliteral">&quot;{0} from {1} to {2}&quot;</span>, originalModel.Id, originalModel.Path, rawPath),</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html">Instance</a> = originalModel,</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; CancelRightsType = <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20">RightsType</a>.InstanceManager,</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; CancelRight = (ulong)<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Relocate,</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; StartedBy = <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a></div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; };</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; await jobManager.RegisterOperation(job, (paramJob, databaseContextFactory, progressHandler, ct) =&gt; instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; api.MoveJob = job.ToApi();</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">if</span> (originalModel.Online.Value &amp;&amp; model.AutoUpdateInterval.HasValue &amp;&amp; oldAutoUpdateInterval != model.AutoUpdateInterval)</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keywordflow">return</span> moving ? (IActionResult)Accepted(api) : Json(api);</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;<span class="preprocessor">#pragma warning restore CA1502</span></div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; [HttpGet(<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_routes.html">Routes</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_routes.html#a63077d90c7d1f0afef5045211241fb47">List</a>)]</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; [TgsAuthorize(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.List | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Read)]</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; [ProducesResponseType(typeof(IEnumerable&lt;Api.Models.Instance&gt;), 200)]</div><div class="line"><a name="l00542"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa1974818becc34b9aa12a67f272016d2"> 542</a></span>&#160; <span class="keyword">public</span> async Task&lt;IActionResult&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa1974818becc34b9aa12a67f272016d2">List</a>(CancellationToken cancellationToken)</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; {</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="class_i_queryable.html">IQueryable</a>&lt;Models.Instance&gt; GetBaseQuery()</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; {</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <a class="code" href="class_i_queryable.html">IQueryable</a>&lt;Models.Instance&gt; query = <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a>;</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a33c97d009719c310c8242a1ef28114d6">InstanceManagerRights</a>.Value.HasFlag(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.List))</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; query = query</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; .Where(x =&gt; x.InstanceUsers.Any(y =&gt; y.UserId == <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f">Id</a>))</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; .Where(x =&gt; x.InstanceUsers.Any(instanceUser =&gt;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; instanceUser.ByondRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9">ByondRights</a>.None ||</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; instanceUser.ChatBotRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72">ChatBotRights</a>.None ||</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; instanceUser.ConfigurationRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c">ConfigurationRights</a>.None ||</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; instanceUser.DreamDaemonRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49">DreamDaemonRights</a>.None ||</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; instanceUser.DreamMakerRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d">DreamMakerRights</a>.None ||</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; instanceUser.InstanceUserRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">InstanceUserRights</a>.None));</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">// Hack for EF IAsyncEnumerable BS</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span> query.Select(x =&gt; x);</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; }</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; var moveJobs = await GetBaseQuery()</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; .SelectMany(x =&gt; x.Jobs)</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;<span class="preprocessor">#pragma warning disable CA1307 // Specify StringComparison</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; .Where(x =&gt; !x.StoppedAt.HasValue &amp;&amp; x.Description.StartsWith(MoveInstanceJobPrefix))</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160;#pragma warning restore CA1307 <span class="comment">// Specify StringComparison</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; .Include(x =&gt; x.StartedBy).ThenInclude(x =&gt; x.CreatedBy)</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; .Include(x =&gt; x.Instance)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; .ToListAsync(cancellationToken)</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; var instances = await GetBaseQuery()</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; .ToListAsync(cancellationToken)</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; var apis = instances.Select(x =&gt; x.ToApi());</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">foreach</span>(var I <span class="keywordflow">in</span> moveJobs)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; apis.Where(x =&gt; x.Id == I.Instance.Id).First().MoveJob = I.ToApi(); <span class="comment">// if this .First() fails i will personally murder kevinz000 because I just know he is somehow responsible</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="keywordflow">return</span> Json(apis);</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; [HttpGet(<span class="stringliteral">&quot;{id}&quot;</span>)]</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; [TgsAuthorize(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.List | <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.Read)]</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; [ProducesResponseType(typeof(Api.Models.Instance), 200)]</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; [ProducesResponseType(410)]</div><div class="line"><a name="l00594"></a><span class="lineno"><a class="line" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a69e19a7f501fca2dd5d707f34edb4c79"> 594</a></span>&#160; <span class="keyword">public</span> async Task&lt;IActionResult&gt; <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a69e19a7f501fca2dd5d707f34edb4c79">GetId</a>(<span class="keywordtype">long</span> <span class="keywordtype">id</span>, CancellationToken cancellationToken)</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; var cantList = !<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a33c97d009719c310c8242a1ef28114d6">InstanceManagerRights</a>.Value.HasFlag(<a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">InstanceManagerRights</a>.List);</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <a class="code" href="class_i_queryable.html">IQueryable</a>&lt;Models.Instance&gt; QueryForUser()</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; var query = <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">DatabaseContext</a></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; .<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Instances</a></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; .AsQueryable()</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; .Where(x =&gt; x.Id == <span class="keywordtype">id</span>);</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <span class="keywordflow">if</span> (cantList)</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; query = query.Include(x =&gt; x.InstanceUsers);</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">return</span> query;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; }</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; var instance = await QueryForUser().FirstOrDefaultAsync(cancellationToken).ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (instance == null)</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">return</span> StatusCode((<span class="keywordtype">int</span>)HttpStatusCode.Gone);</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keywordflow">if</span> (cantList &amp;&amp; !instance.InstanceUsers.Any(instanceUser =&gt; instanceUser.UserId == <a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">AuthenticationContext</a>.<a class="code" href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">User</a>.<a class="code" href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f">Id</a> &amp;&amp;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; (instanceUser.ByondRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9">ByondRights</a>.None ||</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; instanceUser.ChatBotRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72">ChatBotRights</a>.None ||</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; instanceUser.ConfigurationRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c">ConfigurationRights</a>.None ||</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; instanceUser.DreamDaemonRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49">DreamDaemonRights</a>.None ||</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; instanceUser.DreamMakerRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d">DreamMakerRights</a>.None ||</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; instanceUser.InstanceUserRights != <a class="code" href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">InstanceUserRights</a>.None)))</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keywordflow">return</span> Forbid();</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; var api = instance.ToApi();</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; var moveJob = await QueryForUser()</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; .SelectMany(x =&gt; x.Jobs)</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160;<span class="preprocessor">#pragma warning disable CA1307 // Specify StringComparison</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; .Where(x =&gt; !x.StoppedAt.HasValue &amp;&amp; x.Description.StartsWith(MoveInstanceJobPrefix))</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;#pragma warning restore CA1307 <span class="comment">// Specify StringComparison</span></div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; .Include(x =&gt; x.StartedBy).ThenInclude(x =&gt; x.CreatedBy)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; .FirstOrDefaultAsync(cancellationToken)</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; .ConfigureAwait(<span class="keyword">false</span>);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; api.MoveJob = moveJob?.ToApi();</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">return</span> Json(api);</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;}</div><div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_html_aef98c54b24b4d1133ea761784699c360"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#aef98c54b24b4d1133ea761784699c360">Tgstation.Server.Api.Models.Internal.User.Name</a></div><div class="ttdeci">string Name</div><div class="ttdoc">The name of the User </div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html#l00041">User.cs:41</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_ad4cf2228c8dae3c2641251070fee76af"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ad4cf2228c8dae3c2641251070fee76af">Tgstation.Server.Host.Database.DatabaseContext.ChatBots</a></div><div class="ttdeci">DbSet&lt; ChatBot &gt; ChatBots</div><div class="ttdoc">The ChatBots in the DatabaseContext. </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00055">DatabaseContext.cs:55</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html">Tgstation.Server.Host.Security.IAuthenticationContextFactory</a></div><div class="ttdoc">For creating and accessing authentication contexts </div><div class="ttdef"><b>Definition:</b> <a href="_i_authentication_context_factory_8cs_source.html#l00010">IAuthenticationContextFactory.cs:10</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a691a59767073bc7dff0f17b809d07b0c"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c">Tgstation.Server.Api.Rights.ConfigurationRights</a></div><div class="ttdeci">ConfigurationRights</div><div class="ttdoc">Rights for Models.ConfigurationFile </div><div class="ttdef"><b>Definition:</b> <a href="_configuration_rights_8cs_source.html#l00009">ConfigurationRights.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_ae3acd0395152260e6a94c0e47dc72e85"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ae3acd0395152260e6a94c0e47dc72e85">Tgstation.Server.Host.Database.DatabaseContext.WatchdogReattachInformations</a></div><div class="ttdeci">DbSet&lt; DualReattachInformation &gt; WatchdogReattachInformations</div><div class="ttdoc">The DualReattachInformations in the DatabaseContext. </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00090">DatabaseContext.cs:90</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html">Tgstation.Server.Host.Security.AuthenticationContext</a></div><div class="ttdoc">Manages Api.Models.Users for a scope </div><div class="ttdef"><b>Definition:</b> <a href="_authentication_context_8cs_source.html#l00011">AuthenticationContext.cs:11</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a69e19a7f501fca2dd5d707f34edb4c79"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a69e19a7f501fca2dd5d707f34edb4c79">Tgstation.Server.Host.Controllers.InstanceController.GetId</a></div><div class="ttdeci">async Task&lt; IActionResult &gt; GetId(long id, CancellationToken cancellationToken)</div><div class="ttdoc">Get a specific Api.Models.Instance. </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00594">InstanceController.cs:594</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html">Tgstation.Server.Host.Models.DreamMakerSettings</a></div><div class="ttdef"><b>Definition:</b> <a href="_dream_maker_settings_8cs_source.html#l00006">DreamMakerSettings.cs:6</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html">Tgstation.Server.Host.Models.DreamDaemonSettings</a></div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html#l00006">DreamDaemonSettings.cs:6</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_system_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_system.html">Tgstation.Server.Host.System</a></div><div class="ttdef"><b>Definition:</b> <a href="_assembly_information_provider_8cs_source.html#l00005">AssemblyInformationProvider.cs:5</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_models_html_a1a6adb59dd51244efabf4e548e7075c8"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a1a6adb59dd51244efabf4e548e7075c8">Tgstation.Server.Api.Models.ErrorCode</a></div><div class="ttdeci">ErrorCode</div><div class="ttdoc">Types of ErrorMessages that the API may return. </div><div class="ttdef"><b>Definition:</b> <a href="_error_code_8cs_source.html#l00010">ErrorCode.cs:10</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a2a217a19e652f117e2324fb79ed838b9"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9">Tgstation.Server.Api.Rights.ByondRights</a></div><div class="ttdeci">ByondRights</div><div class="ttdoc">Rights for Models.Byond </div><div class="ttdef"><b>Definition:</b> <a href="_byond_rights_8cs_source.html#l00009">ByondRights.cs:9</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a7b02c8c3dadd90810a9eaa24712a0a20"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20">Tgstation.Server.Api.Rights.RightsType</a></div><div class="ttdeci">RightsType</div><div class="ttdoc">The type of rights a model uses </div><div class="ttdef"><b>Definition:</b> <a href="_rights_type_8cs_source.html#l00006">RightsType.cs:6</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api.html">Tgstation.Server.Api</a></div><div class="ttdef"><b>Definition:</b> <a href="_api_headers_8cs_source.html#l00012">ApiHeaders.cs:12</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a5f1b5a9225190982810802d7a85bb601"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601">Tgstation.Server.Api.Rights.InstanceUserRights</a></div><div class="ttdeci">InstanceUserRights</div><div class="ttdoc">Rights for an Models.Instance </div><div class="ttdef"><b>Definition:</b> <a href="_instance_user_rights_8cs_source.html#l00009">InstanceUserRights.cs:9</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_models_html_a0a41c646f859c99d437373d8e6e0545ba9aa1b03934893d7134a660af4204f2a9"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba9aa1b03934893d7134a660af4204f2a9">Tgstation.Server.Api.Models.IrcPasswordType.Server</a></div><div class="ttdoc">Use server authentication </div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_html_a33c97d009719c310c8242a1ef28114d6"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a33c97d009719c310c8242a1ef28114d6">Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights</a></div><div class="ttdeci">InstanceManagerRights InstanceManagerRights</div><div class="ttdoc">The Rights.InstanceManagerRights for the User </div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html#l00053">User.cs:53</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_ad177b6d13a08c429c49b7e4294387d3c"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad177b6d13a08c429c49b7e4294387d3c">Tgstation.Server.Host.Controllers.InstanceController.instanceManager</a></div><div class="ttdeci">readonly IInstanceManager instanceManager</div><div class="ttdoc">The IInstanceManager for the InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00051">InstanceController.cs:51</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_models_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_models.html">Tgstation.Server.Host.Models</a></div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html#l00005">ChatBot.cs:5</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a691a59767073bc7dff0f17b809d07b0ca4ee29ca12c7d126654bd0e5275de6135"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca4ee29ca12c7d126654bd0e5275de6135">Tgstation.Server.Api.Rights.ConfigurationRights.List</a></div><div class="ttdoc">User may list files </div></div>
<div class="ttc" id="namespace_system_html"><div class="ttname"><a href="namespace_system.html">System</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html">Tgstation.Server.Host.Models.RepositorySettings</a></div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html#l00007">RepositorySettings.cs:7</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_aa1974818becc34b9aa12a67f272016d2"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa1974818becc34b9aa12a67f272016d2">Tgstation.Server.Host.Controllers.InstanceController.List</a></div><div class="ttdeci">async Task&lt; IActionResult &gt; List(CancellationToken cancellationToken)</div><div class="ttdoc">List Api.Models.Instances. </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00542">InstanceController.cs:542</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_models_html_ab7bc96f211e450615be8669d10de2440"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440">Tgstation.Server.Api.Models.ConfigurationType</a></div><div class="ttdeci">ConfigurationType</div><div class="ttdoc">The type of configuration allowed on an Instance </div><div class="ttdef"><b>Definition:</b> <a href="_configuration_type_8cs_source.html#l00006">ConfigurationType.cs:6</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a4f60f72c082a222a31383dbfceb755a6"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a4f60f72c082a222a31383dbfceb755a6">Tgstation.Server.Host.Controllers.InstanceController.generalConfiguration</a></div><div class="ttdeci">readonly GeneralConfiguration generalConfiguration</div><div class="ttdoc">The GeneralConfiguration for the InstanceController. </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00071">InstanceController.cs:71</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_html_ade8aeb7dd0a0e480f6f89bd5973703c7"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#ade8aeb7dd0a0e480f6f89bd5973703c7">Tgstation.Server.Host.Security.AuthenticationContext.GetRight</a></div><div class="ttdeci">ulong GetRight(RightsType rightsType)</div><div class="ttdoc">Get the value of a given rightsType </div><div class="ttdef"><b>Definition:</b> <a href="_authentication_context_8cs_source.html#l00046">AuthenticationContext.cs:46</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_ac2e88d53bf1b6ac87d175d83ed39da7c"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#ac2e88d53bf1b6ac87d175d83ed39da7c">Tgstation.Server.Host.Database.DatabaseContext.Save</a></div><div class="ttdeci">Task Save(CancellationToken cancellationToken)</div><div class="ttdoc">Saves changes made to the IDatabaseContext </div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html">Tgstation.Server.Host.Controllers.InstanceController</a></div><div class="ttdoc">ApiController for managing Components.Instances </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00034">InstanceController.cs:34</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_models_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html">Tgstation.Server.Api.Models</a></div><div class="ttdef"><b>Definition:</b> <a href="_administration_8cs_source.html#l00003">Administration.cs:3</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_afb2e4e54c38a97b299d1fb7692cc5cdd"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#afb2e4e54c38a97b299d1fb7692cc5cdd">Tgstation.Server.Host.Controllers.InstanceController.ioManager</a></div><div class="ttdeci">readonly IIOManager ioManager</div><div class="ttdoc">The IIOManager for the InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00056">InstanceController.cs:56</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html">Tgstation.Server.Host.Database.DatabaseContext</a></div><div class="ttdoc">Backend abstract implementation of IDatabaseContext </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00022">DatabaseContext.cs:22</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_assembly_information_provider_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_assembly_information_provider.html">Tgstation.Server.Host.System.IAssemblyInformationProvider</a></div><div class="ttdoc">For retrieving the Assembly&amp;#39;s location. </div><div class="ttdef"><b>Definition:</b> <a href="_i_assembly_information_provider_8cs_source.html#l00009">IAssemblyInformationProvider.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a38f7f9669773242d177345e38be2dd34"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34">Tgstation.Server.Host.Controllers.InstanceController.jobManager</a></div><div class="ttdeci">readonly IJobManager jobManager</div><div class="ttdoc">The IJobManager for the InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00046">InstanceController.cs:46</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_aeb5ae966710833c1841de51f73cb2362"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aeb5ae966710833c1841de51f73cb2362">Tgstation.Server.Host.Controllers.InstanceController.assemblyInformationProvider</a></div><div class="ttdeci">readonly IAssemblyInformationProvider assemblyInformationProvider</div><div class="ttdoc">The IAssemblyInformationProvider for the InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00061">InstanceController.cs:61</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a14134d386ac311c0f7a76b7ef312a2d6"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a14134d386ac311c0f7a76b7ef312a2d6">Tgstation.Server.Host.Controllers.InstanceController.Delete</a></div><div class="ttdeci">async Task&lt; IActionResult &gt; Delete(long id, CancellationToken cancellationToken)</div><div class="ttdoc">Detach an Api.Models.Instance with the given id . </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00320">InstanceController.cs:320</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_routes_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_routes.html">Tgstation.Server.Api.Routes</a></div><div class="ttdoc">Routes to a server actions </div><div class="ttdef"><b>Definition:</b> <a href="_routes_8cs_source.html#l00009">Routes.cs:9</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_acf2642afce6567c03b79876139a10a49"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49">Tgstation.Server.Api.Rights.DreamDaemonRights</a></div><div class="ttdeci">DreamDaemonRights</div><div class="ttdoc">Rights for Models.DreamDaemon </div><div class="ttdef"><b>Definition:</b> <a href="_dream_daemon_rights_8cs_source.html#l00009">DreamDaemonRights.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager_html_a984a32ee93a073036f63d543ad9a6cdd"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a984a32ee93a073036f63d543ad9a6cdd">Tgstation.Server.Host.IO.DefaultIOManager.CurrentDirectory</a></div><div class="ttdeci">const string CurrentDirectory</div><div class="ttdoc">Path to the current working directory for the IIOManager. </div><div class="ttdef"><b>Definition:</b> <a href="_default_i_o_manager_8cs_source.html#l00020">DefaultIOManager.cs:20</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_database_1_1_i_database_context_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_database_1_1_i_database_context.html">Tgstation.Server.Host.Database.IDatabaseContext</a></div><div class="ttdoc">Represents the database. </div><div class="ttdef"><b>Definition:</b> <a href="_i_database_context_8cs_source.html#l00013">IDatabaseContext.cs:13</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_af199a84ed6fe6ca557db9de91070ad79"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79">Tgstation.Server.Api.Rights.InstanceManagerRights</a></div><div class="ttdeci">InstanceManagerRights</div><div class="ttdoc">Rights for managing Models.Instances </div><div class="ttdef"><b>Definition:</b> <a href="_instance_manager_rights_8cs_source.html#l00009">InstanceManagerRights.cs:9</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_configuration_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html">Tgstation.Server.Host.Configuration</a></div><div class="ttdef"><b>Definition:</b> <a href="_control_panel_configuration_8cs_source.html#l00003">ControlPanelConfiguration.cs:3</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_a1bc257ebf1d31bfba7f665d61da5c4a2"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a1bc257ebf1d31bfba7f665d61da5c4a2">Tgstation.Server.Host.Database.DatabaseContext.Instances</a></div><div class="ttdeci">DbSet&lt; Instance &gt; Instances</div><div class="ttdoc">The Instances in the DatabaseContext. </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00035">DatabaseContext.cs:35</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_ad31a819fbeeca3ebd71d35892ce10b19"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad31a819fbeeca3ebd71d35892ce10b19">Tgstation.Server.Host.Controllers.InstanceController.Update</a></div><div class="ttdeci">async Task&lt; IActionResult &gt; Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)</div><div class="ttdoc">Modify an Api.Models.Instance&amp;#39;s settings. </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00366">InstanceController.cs:366</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html">Tgstation.Server.Host.Controllers.ApiController</a></div><div class="ttdoc">A Controller for API functions </div><div class="ttdef"><b>Definition:</b> <a href="_api_controller_8cs_source.html#l00023">ApiController.cs:23</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_a013e9ece5b0c1f83eb7eb891a8e09489"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a013e9ece5b0c1f83eb7eb891a8e09489">Tgstation.Server.Host.Database.DatabaseContext.ReattachInformations</a></div><div class="ttdeci">DbSet&lt; ReattachInformation &gt; ReattachInformations</div><div class="ttdoc">The ReattachInformations in the DatabaseContext. </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00085">DatabaseContext.cs:85</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a6aac419b6a793fe07657d96ac48dee5d"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d">Tgstation.Server.Api.Rights.DreamMakerRights</a></div><div class="ttdeci">DreamMakerRights</div><div class="ttdoc">Rights for Models.DreamMaker </div><div class="ttdef"><b>Definition:</b> <a href="_dream_maker_rights_8cs_source.html#l00009">DreamMakerRights.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context_html_a67a792509733c253bc1a9e45bdf7fb1b"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html#a67a792509733c253bc1a9e45bdf7fb1b">Tgstation.Server.Host.Database.DatabaseContext.InstanceUsers</a></div><div class="ttdeci">DbSet&lt; InstanceUser &gt; InstanceUsers</div><div class="ttdoc">The InstanceUsers in the DatabaseContext. </div><div class="ttdef"><b>Definition:</b> <a href="_database_context_8cs_source.html#l00070">DatabaseContext.cs:70</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a95336db3db40dbae9701ef6e51240f39"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39">Tgstation.Server.Api.Rights.RepositoryRights</a></div><div class="ttdeci">RepositoryRights</div><div class="ttdoc">Rights for a Models.Repository </div><div class="ttdef"><b>Definition:</b> <a href="_repository_rights_8cs_source.html#l00009">RepositoryRights.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_addd1307d3fea6368330400f6927ee701"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#addd1307d3fea6368330400f6927ee701">Tgstation.Server.Host.Controllers.InstanceController.InstanceController</a></div><div class="ttdeci">InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider, IPlatformIdentifier platformIdentifier, IOptions&lt; GeneralConfiguration &gt; generalConfigurationOptions, ILogger&lt; InstanceController &gt; logger)</div><div class="ttdoc">Construct a InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00085">InstanceController.cs:85</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_security_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_security.html">Tgstation.Server.Host.Security</a></div><div class="ttdef"><b>Definition:</b> <a href="_authentication_context_8cs_source.html#l00006">AuthenticationContext.cs:6</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html">Tgstation.Server.Api.Rights</a></div><div class="ttdef"><b>Definition:</b> <a href="_administration_rights_8cs_source.html#l00003">AdministrationRights.cs:3</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_routes_html_a17bfc22b8cbc4624a6ec180aeba91da8"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_routes.html#a17bfc22b8cbc4624a6ec180aeba91da8">Tgstation.Server.Api.Routes.InstanceManager</a></div><div class="ttdeci">const string InstanceManager</div><div class="ttdoc">The Models.Instance controller </div><div class="ttdef"><b>Definition:</b> <a href="_routes_8cs_source.html#l00029">Routes.cs:29</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_ac62c0b1b0e346409b20c3054d4a8354a"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ac62c0b1b0e346409b20c3054d4a8354a">Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier</a></div><div class="ttdeci">readonly IPlatformIdentifier platformIdentifier</div><div class="ttdoc">The IPlatformIdentifier for the InstanceController </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00066">InstanceController.cs:66</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html">Tgstation.Server.Host.Components.IInstanceManager</a></div><div class="ttdoc">For managing IInstances </div><div class="ttdef"><b>Definition:</b> <a href="_i_instance_manager_8cs_source.html#l00011">IInstanceManager.cs:11</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a8b8a858eef2c16d29e1aff3603f91cce"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8b8a858eef2c16d29e1aff3603f91cce">Tgstation.Server.Host.Controllers.InstanceController.NormalizePath</a></div><div class="ttdeci">string NormalizePath(string path)</div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00105">InstanceController.cs:105</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_html_a2c0d8cf4d64347a18c9a6251f9a5783f"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f">Tgstation.Server.Api.Models.Internal.User.Id</a></div><div class="ttdeci">long Id</div><div class="ttdoc">The ID of the User </div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html#l00016">User.cs:16</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html">Tgstation.Server.Api.Models.Instance</a></div><div class="ttdoc">Metadata about a server instance </div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html#l00009">Instance.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html">Tgstation.Server.Host.Configuration.GeneralConfiguration</a></div><div class="ttdoc">General configuration options </div><div class="ttdef"><b>Definition:</b> <a href="_general_configuration_8cs_source.html#l00010">GeneralConfiguration.cs:10</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_jobs_1_1_i_job_manager_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_jobs_1_1_i_job_manager.html">Tgstation.Server.Host.Jobs.IJobManager</a></div><div class="ttdoc">Manages the runtime of Jobs </div><div class="ttdef"><b>Definition:</b> <a href="_i_job_manager_8cs_source.html#l00013">IJobManager.cs:13</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_components_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_components.html">Tgstation.Server.Host.Components</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_jobs_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_jobs.html">Tgstation.Server.Host.Jobs</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_job_manager_8cs_source.html#l00008">IJobManager.cs:8</a></div></div>
<div class="ttc" id="class_i_queryable_html"><div class="ttname"><a href="class_i_queryable.html">IQueryable</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings_html_a7d310dcc01986cdbfb6bb41d1f80825d"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a7d310dcc01986cdbfb6bb41d1f80825d">Tgstation.Server.Host.Models.DreamMakerSettings.Instance</a></div><div class="ttdeci">Instance Instance</div><div class="ttdoc">The parent Models.Instance </div><div class="ttdef"><b>Definition:</b> <a href="_dream_maker_settings_8cs_source.html#l00022">DreamMakerSettings.cs:22</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html">Tgstation.Server.Host.IO.DefaultIOManager</a></div><div class="ttdoc">IIOManager that resolves paths to Environment.CurrentDirectory </div><div class="ttdef"><b>Definition:</b> <a href="_default_i_o_manager_8cs_source.html#l00015">DefaultIOManager.cs:15</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_html"><div class="ttname"><a href="namespace_tgstation_1_1_server.html">Tgstation.Server</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_models_html_ad4850e6b78816679602b13d63d2869b5"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5">Tgstation.Server.Api.Models.DreamDaemonSecurity</a></div><div class="ttdeci">DreamDaemonSecurity</div><div class="ttdoc">DreamDaemon&amp;#39;s security level </div><div class="ttdef"><b>Definition:</b> <a href="_dream_daemon_security_8cs_source.html#l00006">DreamDaemonSecurity.cs:6</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_routes_html_a63077d90c7d1f0afef5045211241fb47"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_routes.html#a63077d90c7d1f0afef5045211241fb47">Tgstation.Server.Api.Routes.List</a></div><div class="ttdeci">const string List</div><div class="ttdoc">The postfix for list operations </div><div class="ttdef"><b>Definition:</b> <a href="_routes_8cs_source.html#l00084">Routes.cs:84</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html">Tgstation.Server.Host.IO.IIOManager</a></div><div class="ttdoc">Interface for using filesystems </div><div class="ttdef"><b>Definition:</b> <a href="_i_i_o_manager_8cs_source.html#l00011">IIOManager.cs:11</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller_html_a8712ba6603139064d68520e16c076901"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8712ba6603139064d68520e16c076901">Tgstation.Server.Host.Controllers.InstanceController.Create</a></div><div class="ttdeci">async Task&lt; IActionResult &gt; Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)</div><div class="ttdoc">Create or attach an Api.Models.Instance. </div><div class="ttdef"><b>Definition:</b> <a href="_instance_controller_8cs_source.html#l00141">InstanceController.cs:141</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_api_1_1_rights_html_a580a36a11165b2590be342b45c31ec72"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72">Tgstation.Server.Api.Rights.ChatBotRights</a></div><div class="ttdeci">ChatBotRights</div><div class="ttdoc">Rights for Models.ChatBot </div><div class="ttdef"><b>Definition:</b> <a href="_chat_bot_rights_8cs_source.html#l00009">ChatBotRights.cs:9</a></div></div>
<div class="ttc" id="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_platform_identifier_html"><div class="ttname"><a href="interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_platform_identifier.html">Tgstation.Server.Host.System.IPlatformIdentifier</a></div><div class="ttdoc">For identifying the current platform </div><div class="ttdef"><b>Definition:</b> <a href="_i_platform_identifier_8cs_source.html#l00006">IPlatformIdentifier.cs:6</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message_html"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html">Tgstation.Server.Api.Models.ErrorMessage</a></div><div class="ttdoc">Represents an error message returned by the server </div><div class="ttdef"><b>Definition:</b> <a href="_error_message_8cs_source.html#l00009">ErrorMessage.cs:9</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_html_a0846ac9679599a99923987863edb0d5c"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c">Tgstation.Server.Host.Security.AuthenticationContext.User</a></div><div class="ttdeci">User User</div><div class="ttdef"><b>Definition:</b> <a href="_authentication_context_8cs_source.html#l00014">AuthenticationContext.cs:14</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host.html">Tgstation.Server.Host</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_database_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_database.html">Tgstation.Server.Host.Database</a></div><div class="ttdef"><b>Definition:</b> <a href="_database_collection_8cs_source.html#l00009">DatabaseCollection.cs:9</a></div></div>
<div class="ttc" id="namespace_tgstation_html"><div class="ttname"><a href="namespace_tgstation.html">Tgstation</a></div></div>
<div class="ttc" id="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_html_a6e95c489b01ba0ca06a8a803e2df9b9f"><div class="ttname"><a href="class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a6e95c489b01ba0ca06a8a803e2df9b9f">Tgstation.Server.Host.Models.Instance.DefaultChatBotLimit</a></div><div class="ttdeci">const ushort DefaultChatBotLimit</div><div class="ttdoc">Default for Api.Models.Instance.ChatBotLimit. </div><div class="ttdef"><b>Definition:</b> <a href="_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html#l00013">Instance.cs:13</a></div></div>
<div class="ttc" id="namespace_tgstation_1_1_server_1_1_host_1_1_i_o_html"><div class="ttname"><a href="namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html">Tgstation.Server.Host.IO</a></div><div class="ttdef"><b>Definition:</b> <a href="_console_8cs_source.html#l00006">Console.cs:6</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>