diff --git a/20180906135553___m_s_initial_create_8_designer_8cs.html b/20180906135553___m_s_initial_create_8_designer_8cs.html index 50830de31d..57f29aa38f 100644 --- a/20180906135553___m_s_initial_create_8_designer_8cs.html +++ b/20180906135553___m_s_initial_create_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906135553___m_s_initial_create_8_designer_8cs_source.html b/20180906135553___m_s_initial_create_8_designer_8cs_source.html index b612b542d2..cbe17961da 100644 --- a/20180906135553___m_s_initial_create_8_designer_8cs_source.html +++ b/20180906135553___m_s_initial_create_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906135553___m_s_initial_create_8cs.html b/20180906135553___m_s_initial_create_8cs.html index 4f70ff1222..368a0b2542 100644 --- a/20180906135553___m_s_initial_create_8cs.html +++ b/20180906135553___m_s_initial_create_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906135553___m_s_initial_create_8cs_source.html b/20180906135553___m_s_initial_create_8cs_source.html index 78f6cf7494..3b7673ba45 100644 --- a/20180906135553___m_s_initial_create_8cs_source.html +++ b/20180906135553___m_s_initial_create_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906143029___m_y_initial_create_8_designer_8cs.html b/20180906143029___m_y_initial_create_8_designer_8cs.html index 0ec9c06957..96c7f49c03 100644 --- a/20180906143029___m_y_initial_create_8_designer_8cs.html +++ b/20180906143029___m_y_initial_create_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906143029___m_y_initial_create_8_designer_8cs_source.html b/20180906143029___m_y_initial_create_8_designer_8cs_source.html index 63653a616f..0d9ded9d79 100644 --- a/20180906143029___m_y_initial_create_8_designer_8cs_source.html +++ b/20180906143029___m_y_initial_create_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906143029___m_y_initial_create_8cs.html b/20180906143029___m_y_initial_create_8cs.html index 3fbd5a6754..f7a4d92fc1 100644 --- a/20180906143029___m_y_initial_create_8cs.html +++ b/20180906143029___m_y_initial_create_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180906143029___m_y_initial_create_8cs_source.html b/20180906143029___m_y_initial_create_8cs_source.html index eebb8b866f..a58c812cf9 100644 --- a/20180906143029___m_y_initial_create_8cs_source.html +++ b/20180906143029___m_y_initial_create_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918020726___m_y_add_minimum_security_8_designer_8cs.html b/20180918020726___m_y_add_minimum_security_8_designer_8cs.html index de86b51a7f..6eeda1e2e7 100644 --- a/20180918020726___m_y_add_minimum_security_8_designer_8cs.html +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html b/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html index 43adb637dd..d157d27ba0 100644 --- a/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918020726___m_y_add_minimum_security_8cs.html b/20180918020726___m_y_add_minimum_security_8cs.html index 389a7fc489..9a839d918d 100644 --- a/20180918020726___m_y_add_minimum_security_8cs.html +++ b/20180918020726___m_y_add_minimum_security_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918020726___m_y_add_minimum_security_8cs_source.html b/20180918020726___m_y_add_minimum_security_8cs_source.html index 2aaba695af..1f9f00feb7 100644 --- a/20180918020726___m_y_add_minimum_security_8cs_source.html +++ b/20180918020726___m_y_add_minimum_security_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918021228___m_s_add_minimum_security_8_designer_8cs.html b/20180918021228___m_s_add_minimum_security_8_designer_8cs.html index 392fd3eda2..35741dfa28 100644 --- a/20180918021228___m_s_add_minimum_security_8_designer_8cs.html +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html b/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html index 111370e8e1..a9eafee563 100644 --- a/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918021228___m_s_add_minimum_security_8cs.html b/20180918021228___m_s_add_minimum_security_8cs.html index 090a7ccf73..8553386e01 100644 --- a/20180918021228___m_s_add_minimum_security_8cs.html +++ b/20180918021228___m_s_add_minimum_security_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918021228___m_s_add_minimum_security_8cs_source.html b/20180918021228___m_s_add_minimum_security_8cs_source.html index ee42311601..9d3f584328 100644 --- a/20180918021228___m_s_add_minimum_security_8cs_source.html +++ b/20180918021228___m_s_add_minimum_security_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html index a04e26aad0..3e87570281 100644 --- a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html index 9be5f6100d..c91dbba12b 100644 --- a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html index 36d8a49380..6747039846 100644 --- a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html index baba2a9e7d..c927d89dc0 100644 --- a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html index a27624a783..c6b4d9b8c8 100644 --- a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html index 60e310ea72..4874671208 100644 --- a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html index 3a5ee6dc5b..10c5417c60 100644 --- a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html index 3565f50f8a..658449fa8f 100644 --- a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html index 22f6ceaf48..eb79955aac 100644 --- a/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html index 29e0954961..dd58121ab4 100644 --- a/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926033145___m_s_reattach_compile_job_required_8cs.html b/20180926033145___m_s_reattach_compile_job_required_8cs.html index 51d2c88a29..a42b8a6b70 100644 --- a/20180926033145___m_s_reattach_compile_job_required_8cs.html +++ b/20180926033145___m_s_reattach_compile_job_required_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926033145___m_s_reattach_compile_job_required_8cs_source.html b/20180926033145___m_s_reattach_compile_job_required_8cs_source.html index 571e972731..04393d997e 100644 --- a/20180926033145___m_s_reattach_compile_job_required_8cs_source.html +++ b/20180926033145___m_s_reattach_compile_job_required_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html index 450d3ae6b2..1b8de18482 100644 --- a/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html index 7340b96db0..d7cbceff64 100644 --- a/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926034014___m_y_reattach_compile_job_required_8cs.html b/20180926034014___m_y_reattach_compile_job_required_8cs.html index 541460432d..47f7a79d25 100644 --- a/20180926034014___m_y_reattach_compile_job_required_8cs.html +++ b/20180926034014___m_y_reattach_compile_job_required_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20180926034014___m_y_reattach_compile_job_required_8cs_source.html b/20180926034014___m_y_reattach_compile_job_required_8cs_source.html index 5b9d7bbd8d..0ff4dc57ee 100644 --- a/20180926034014___m_y_reattach_compile_job_required_8cs_source.html +++ b/20180926034014___m_y_reattach_compile_job_required_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html index b80d90106a..61f1a7cc3e 100644 --- a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html index e733c0e560..91c20bff3b 100644 --- a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8cs.html index eaf7f4935e..b0b26a4900 100644 --- a/20181124231534___m_s_toggle_testmerge_comments_8cs.html +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html index dd9319cb05..58bf3f465a 100644 --- a/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html index 38e2b7ace1..f823b7ae3e 100644 --- a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html index e329424232..b950af7052 100644 --- a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8cs.html index ddc1174975..f83ee5743d 100644 --- a/20181124231549___m_y_toggle_testmerge_comments_8cs.html +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html index 4ad3bee4fd..db88f895b7 100644 --- a/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html index ae43ba3a6d..107da95f7a 100644 --- a/20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html +++ b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html index a8f430e5c7..7941c5250a 100644 --- a/20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html +++ b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219041825___m_s_fix_rev_info_index_8cs.html b/20190219041825___m_s_fix_rev_info_index_8cs.html index 13bee96bb2..4afd927155 100644 --- a/20190219041825___m_s_fix_rev_info_index_8cs.html +++ b/20190219041825___m_s_fix_rev_info_index_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219041825___m_s_fix_rev_info_index_8cs_source.html b/20190219041825___m_s_fix_rev_info_index_8cs_source.html index 6304688d63..52a66fbb2a 100644 --- a/20190219041825___m_s_fix_rev_info_index_8cs_source.html +++ b/20190219041825___m_s_fix_rev_info_index_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html index 73421a2358..d5da97ea68 100644 --- a/20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html +++ b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html index 1557fb72d2..d805d0f1c0 100644 --- a/20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html +++ b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219042440___m_y_fix_rev_info_index_8cs.html b/20190219042440___m_y_fix_rev_info_index_8cs.html index dbc61521d2..67ca6230b2 100644 --- a/20190219042440___m_y_fix_rev_info_index_8cs.html +++ b/20190219042440___m_y_fix_rev_info_index_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20190219042440___m_y_fix_rev_info_index_8cs_source.html b/20190219042440___m_y_fix_rev_info_index_8cs_source.html index e017e46b4a..cffa230586 100644 --- a/20190219042440___m_y_fix_rev_info_index_8cs_source.html +++ b/20190219042440___m_y_fix_rev_info_index_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs.html b/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs.html index 8484b994b2..bcb6c93ed5 100644 --- a/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs.html +++ b/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs_source.html b/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs_source.html index ec129c7701..7ec801d8eb 100644 --- a/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs_source.html +++ b/20200121170252___m_s_add_chat_bot_reconnection_interval_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs.html b/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs.html index 810fc3141e..054f127cc3 100644 --- a/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs.html +++ b/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs_source.html b/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs_source.html index 9360e759ec..63557cd024 100644 --- a/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs_source.html +++ b/20200121170252___m_s_add_chat_bot_reconnection_interval_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs.html b/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs.html index ba2a3a2873..f726e191df 100644 --- a/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs.html +++ b/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs_source.html b/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs_source.html index 2d264aac6d..e8d57c148a 100644 --- a/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs_source.html +++ b/20200121171159___m_y_add_chat_bot_reconnection_interval_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs.html b/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs.html index 1e0bc51583..94a4876379 100644 --- a/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs.html +++ b/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs_source.html b/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs_source.html index 74726849d9..0fb041706a 100644 --- a/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs_source.html +++ b/20200121171159___m_y_add_chat_bot_reconnection_interval_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411164808___m_s_tons_of_validation_8_designer_8cs.html b/20200411164808___m_s_tons_of_validation_8_designer_8cs.html index 12dcd59d91..d5568632b0 100644 --- a/20200411164808___m_s_tons_of_validation_8_designer_8cs.html +++ b/20200411164808___m_s_tons_of_validation_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411164808___m_s_tons_of_validation_8_designer_8cs_source.html b/20200411164808___m_s_tons_of_validation_8_designer_8cs_source.html index 5097f9ec42..913d922efd 100644 --- a/20200411164808___m_s_tons_of_validation_8_designer_8cs_source.html +++ b/20200411164808___m_s_tons_of_validation_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411164808___m_s_tons_of_validation_8cs.html b/20200411164808___m_s_tons_of_validation_8cs.html index f333cd2332..3b178644ce 100644 --- a/20200411164808___m_s_tons_of_validation_8cs.html +++ b/20200411164808___m_s_tons_of_validation_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411164808___m_s_tons_of_validation_8cs_source.html b/20200411164808___m_s_tons_of_validation_8cs_source.html index a6f2f94f36..9296cbf248 100644 --- a/20200411164808___m_s_tons_of_validation_8cs_source.html +++ b/20200411164808___m_s_tons_of_validation_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411170010___m_y_tons_of_validation_8_designer_8cs.html b/20200411170010___m_y_tons_of_validation_8_designer_8cs.html index b0468b4b2a..6e29c529e9 100644 --- a/20200411170010___m_y_tons_of_validation_8_designer_8cs.html +++ b/20200411170010___m_y_tons_of_validation_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411170010___m_y_tons_of_validation_8_designer_8cs_source.html b/20200411170010___m_y_tons_of_validation_8_designer_8cs_source.html index 64e3fcbdb7..5c183eb5aa 100644 --- a/20200411170010___m_y_tons_of_validation_8_designer_8cs_source.html +++ b/20200411170010___m_y_tons_of_validation_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411170010___m_y_tons_of_validation_8cs.html b/20200411170010___m_y_tons_of_validation_8cs.html index b10fa1efdb..bea02c4584 100644 --- a/20200411170010___m_y_tons_of_validation_8cs.html +++ b/20200411170010___m_y_tons_of_validation_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200411170010___m_y_tons_of_validation_8cs_source.html b/20200411170010___m_y_tons_of_validation_8cs_source.html index 88e535a363..f6e8623f48 100644 --- a/20200411170010___m_y_tons_of_validation_8cs_source.html +++ b/20200411170010___m_y_tons_of_validation_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420175359___m_s_limits_on_chat_8_designer_8cs.html b/20200420175359___m_s_limits_on_chat_8_designer_8cs.html index 7ad141fdca..e4701f29e9 100644 --- a/20200420175359___m_s_limits_on_chat_8_designer_8cs.html +++ b/20200420175359___m_s_limits_on_chat_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420175359___m_s_limits_on_chat_8_designer_8cs_source.html b/20200420175359___m_s_limits_on_chat_8_designer_8cs_source.html index 9315416985..1f8e484c0a 100644 --- a/20200420175359___m_s_limits_on_chat_8_designer_8cs_source.html +++ b/20200420175359___m_s_limits_on_chat_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420175359___m_s_limits_on_chat_8cs.html b/20200420175359___m_s_limits_on_chat_8cs.html index a807e8de35..351c83c5a8 100644 --- a/20200420175359___m_s_limits_on_chat_8cs.html +++ b/20200420175359___m_s_limits_on_chat_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420175359___m_s_limits_on_chat_8cs_source.html b/20200420175359___m_s_limits_on_chat_8cs_source.html index 2bcd03cbea..a91316229a 100644 --- a/20200420175359___m_s_limits_on_chat_8cs_source.html +++ b/20200420175359___m_s_limits_on_chat_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420181015___m_y_limits_on_chat_8_designer_8cs.html b/20200420181015___m_y_limits_on_chat_8_designer_8cs.html index 63144044b3..414a02dfd7 100644 --- a/20200420181015___m_y_limits_on_chat_8_designer_8cs.html +++ b/20200420181015___m_y_limits_on_chat_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420181015___m_y_limits_on_chat_8_designer_8cs_source.html b/20200420181015___m_y_limits_on_chat_8_designer_8cs_source.html index c10131bcc3..fdcd4798e8 100644 --- a/20200420181015___m_y_limits_on_chat_8_designer_8cs_source.html +++ b/20200420181015___m_y_limits_on_chat_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420181015___m_y_limits_on_chat_8cs.html b/20200420181015___m_y_limits_on_chat_8cs.html index fcfbd9254b..398139e265 100644 --- a/20200420181015___m_y_limits_on_chat_8cs.html +++ b/20200420181015___m_y_limits_on_chat_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200420181015___m_y_limits_on_chat_8cs_source.html b/20200420181015___m_y_limits_on_chat_8cs_source.html index 87f8a73a0f..5dbc9d52eb 100644 --- a/20200420181015___m_y_limits_on_chat_8cs_source.html +++ b/20200420181015___m_y_limits_on_chat_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs.html b/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs.html index 6a206eead5..d4a35f123c 100644 --- a/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs.html +++ b/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs_source.html b/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs_source.html index 730d279ab1..edf56287e0 100644 --- a/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs_source.html +++ b/20200422001202___m_s_add_compile_job_d_m_api_version_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422001202___m_s_add_compile_job_d_m_api_version_8cs.html b/20200422001202___m_s_add_compile_job_d_m_api_version_8cs.html index 90561fa824..a6d520afb0 100644 --- a/20200422001202___m_s_add_compile_job_d_m_api_version_8cs.html +++ b/20200422001202___m_s_add_compile_job_d_m_api_version_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422001202___m_s_add_compile_job_d_m_api_version_8cs_source.html b/20200422001202___m_s_add_compile_job_d_m_api_version_8cs_source.html index c8d2169404..579afa33c8 100644 --- a/20200422001202___m_s_add_compile_job_d_m_api_version_8cs_source.html +++ b/20200422001202___m_s_add_compile_job_d_m_api_version_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs.html b/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs.html index ae07f2eb27..4425d72610 100644 --- a/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs.html +++ b/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs_source.html b/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs_source.html index 7750f58338..3c4cc18751 100644 --- a/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs_source.html +++ b/20200422010115___m_y_add_compile_job_d_m_api_version_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422010115___m_y_add_compile_job_d_m_api_version_8cs.html b/20200422010115___m_y_add_compile_job_d_m_api_version_8cs.html index 7f3db7d48d..5bf65342c2 100644 --- a/20200422010115___m_y_add_compile_job_d_m_api_version_8cs.html +++ b/20200422010115___m_y_add_compile_job_d_m_api_version_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200422010115___m_y_add_compile_job_d_m_api_version_8cs_source.html b/20200422010115___m_y_add_compile_job_d_m_api_version_8cs_source.html index 48ddf02195..986d0c3ecd 100644 --- a/20200422010115___m_y_add_compile_job_d_m_api_version_8cs_source.html +++ b/20200422010115___m_y_add_compile_job_d_m_api_version_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs.html b/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs.html index d17d1b553c..4f9a735c7e 100644 --- a/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs.html +++ b/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs_source.html b/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs_source.html index 08dccfd748..bd23ab7308 100644 --- a/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs_source.html +++ b/20200423003841___m_y_checkpoint_rebuild_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423003841___m_y_checkpoint_rebuild_8cs.html b/20200423003841___m_y_checkpoint_rebuild_8cs.html index 6d6011d34c..f857559b11 100644 --- a/20200423003841___m_y_checkpoint_rebuild_8cs.html +++ b/20200423003841___m_y_checkpoint_rebuild_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423003841___m_y_checkpoint_rebuild_8cs_source.html b/20200423003841___m_y_checkpoint_rebuild_8cs_source.html index df75c369a1..04b8b07867 100644 --- a/20200423003841___m_y_checkpoint_rebuild_8cs_source.html +++ b/20200423003841___m_y_checkpoint_rebuild_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs.html b/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs.html index f226fc26e7..aa0d8c4776 100644 --- a/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs.html +++ b/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs_source.html b/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs_source.html index 731553b20a..6a0b373df4 100644 --- a/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs_source.html +++ b/20200423004015___m_s_checkpoint_rebuild_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423004015___m_s_checkpoint_rebuild_8cs.html b/20200423004015___m_s_checkpoint_rebuild_8cs.html index a73537837d..81a92a1ae7 100644 --- a/20200423004015___m_s_checkpoint_rebuild_8cs.html +++ b/20200423004015___m_s_checkpoint_rebuild_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423004015___m_s_checkpoint_rebuild_8cs_source.html b/20200423004015___m_s_checkpoint_rebuild_8cs_source.html index 61797e2ae7..8515fbaf70 100644 --- a/20200423004015___m_s_checkpoint_rebuild_8cs_source.html +++ b/20200423004015___m_s_checkpoint_rebuild_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs.html b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs.html index 9fa78328f5..3d8b030c5b 100644 --- a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs.html +++ b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html index 1363dd2d76..00adae9754 100644 --- a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html +++ b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs.html b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs.html index f1d7d2ff91..0e97fa8ae2 100644 --- a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs.html +++ b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs_source.html b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs_source.html index 0ad064ffa1..f84110f414 100644 --- a/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs_source.html +++ b/20200423052142___m_s_kill_jsons_add_d_m_api_version_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs.html b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs.html index deb6b3655f..1795755200 100644 --- a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs.html +++ b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html index e5456346f2..2842293ca6 100644 --- a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html +++ b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs.html b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs.html index 5cbe826ed3..a3bcac1374 100644 --- a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs.html +++ b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs_source.html b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs_source.html index 0fd5268f53..f2f5f54e29 100644 --- a/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs_source.html +++ b/20200423052709___m_y_kill_jsons_add_d_m_api_version_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024433___m_s_add_job_error_codes_8_designer_8cs.html b/20200425024433___m_s_add_job_error_codes_8_designer_8cs.html index d56c8795eb..c8c1d33450 100644 --- a/20200425024433___m_s_add_job_error_codes_8_designer_8cs.html +++ b/20200425024433___m_s_add_job_error_codes_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024433___m_s_add_job_error_codes_8_designer_8cs_source.html b/20200425024433___m_s_add_job_error_codes_8_designer_8cs_source.html index 88f363b6f0..680365d8c5 100644 --- a/20200425024433___m_s_add_job_error_codes_8_designer_8cs_source.html +++ b/20200425024433___m_s_add_job_error_codes_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024433___m_s_add_job_error_codes_8cs.html b/20200425024433___m_s_add_job_error_codes_8cs.html index b8dfdc1553..6d35e2ef4e 100644 --- a/20200425024433___m_s_add_job_error_codes_8cs.html +++ b/20200425024433___m_s_add_job_error_codes_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024433___m_s_add_job_error_codes_8cs_source.html b/20200425024433___m_s_add_job_error_codes_8cs_source.html index bf7377034a..838b3dbe68 100644 --- a/20200425024433___m_s_add_job_error_codes_8cs_source.html +++ b/20200425024433___m_s_add_job_error_codes_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024953___m_y_add_job_error_codes_8_designer_8cs.html b/20200425024953___m_y_add_job_error_codes_8_designer_8cs.html index 028ecbbad5..6f24907077 100644 --- a/20200425024953___m_y_add_job_error_codes_8_designer_8cs.html +++ b/20200425024953___m_y_add_job_error_codes_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024953___m_y_add_job_error_codes_8_designer_8cs_source.html b/20200425024953___m_y_add_job_error_codes_8_designer_8cs_source.html index 399d93d0d8..856252c7a4 100644 --- a/20200425024953___m_y_add_job_error_codes_8_designer_8cs_source.html +++ b/20200425024953___m_y_add_job_error_codes_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024953___m_y_add_job_error_codes_8cs.html b/20200425024953___m_y_add_job_error_codes_8cs.html index 34b29e4685..faab658722 100644 --- a/20200425024953___m_y_add_job_error_codes_8cs.html +++ b/20200425024953___m_y_add_job_error_codes_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200425024953___m_y_add_job_error_codes_8cs_source.html b/20200425024953___m_y_add_job_error_codes_8cs_source.html index 2413500a30..0d44445ba0 100644 --- a/20200425024953___m_y_add_job_error_codes_8cs_source.html +++ b/20200425024953___m_y_add_job_error_codes_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427173852___m_s_fix_cascading_delete_8_designer_8cs.html b/20200427173852___m_s_fix_cascading_delete_8_designer_8cs.html index b6e3ae2cce..7a679a2c25 100644 --- a/20200427173852___m_s_fix_cascading_delete_8_designer_8cs.html +++ b/20200427173852___m_s_fix_cascading_delete_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427173852___m_s_fix_cascading_delete_8_designer_8cs_source.html b/20200427173852___m_s_fix_cascading_delete_8_designer_8cs_source.html index 294d1713f2..c7880a7c0e 100644 --- a/20200427173852___m_s_fix_cascading_delete_8_designer_8cs_source.html +++ b/20200427173852___m_s_fix_cascading_delete_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427173852___m_s_fix_cascading_delete_8cs.html b/20200427173852___m_s_fix_cascading_delete_8cs.html index 83771edbb9..090617e34c 100644 --- a/20200427173852___m_s_fix_cascading_delete_8cs.html +++ b/20200427173852___m_s_fix_cascading_delete_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427173852___m_s_fix_cascading_delete_8cs_source.html b/20200427173852___m_s_fix_cascading_delete_8cs_source.html index 35803a6b9f..fe1f2ac787 100644 --- a/20200427173852___m_s_fix_cascading_delete_8cs_source.html +++ b/20200427173852___m_s_fix_cascading_delete_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180159___m_y_fix_cascading_delete_8_designer_8cs.html b/20200427180159___m_y_fix_cascading_delete_8_designer_8cs.html index 2f5deb5b85..c0e188e0d7 100644 --- a/20200427180159___m_y_fix_cascading_delete_8_designer_8cs.html +++ b/20200427180159___m_y_fix_cascading_delete_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180159___m_y_fix_cascading_delete_8_designer_8cs_source.html b/20200427180159___m_y_fix_cascading_delete_8_designer_8cs_source.html index 2d07a95e5b..ca72cb1241 100644 --- a/20200427180159___m_y_fix_cascading_delete_8_designer_8cs_source.html +++ b/20200427180159___m_y_fix_cascading_delete_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180159___m_y_fix_cascading_delete_8cs.html b/20200427180159___m_y_fix_cascading_delete_8cs.html index d83483e3b3..7bcd540d77 100644 --- a/20200427180159___m_y_fix_cascading_delete_8cs.html +++ b/20200427180159___m_y_fix_cascading_delete_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180159___m_y_fix_cascading_delete_8cs_source.html b/20200427180159___m_y_fix_cascading_delete_8cs_source.html index 6eef85348c..796132016e 100644 --- a/20200427180159___m_y_fix_cascading_delete_8cs_source.html +++ b/20200427180159___m_y_fix_cascading_delete_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180904___s_l_rebuild_8_designer_8cs.html b/20200427180904___s_l_rebuild_8_designer_8cs.html index 61f0d40ad9..095449021d 100644 --- a/20200427180904___s_l_rebuild_8_designer_8cs.html +++ b/20200427180904___s_l_rebuild_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180904___s_l_rebuild_8_designer_8cs_source.html b/20200427180904___s_l_rebuild_8_designer_8cs_source.html index aefd335677..50ae267094 100644 --- a/20200427180904___s_l_rebuild_8_designer_8cs_source.html +++ b/20200427180904___s_l_rebuild_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180904___s_l_rebuild_8cs.html b/20200427180904___s_l_rebuild_8cs.html index b848f38a6c..bda0a7593b 100644 --- a/20200427180904___s_l_rebuild_8cs.html +++ b/20200427180904___s_l_rebuild_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200427180904___s_l_rebuild_8cs_source.html b/20200427180904___s_l_rebuild_8cs_source.html index 12d61d9e60..77042bb598 100644 --- a/20200427180904___s_l_rebuild_8cs_source.html +++ b/20200427180904___s_l_rebuild_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511005957___m_s_add_heartbeat_8_designer_8cs.html b/20200511005957___m_s_add_heartbeat_8_designer_8cs.html index 081bbf0afe..1c96d65748 100644 --- a/20200511005957___m_s_add_heartbeat_8_designer_8cs.html +++ b/20200511005957___m_s_add_heartbeat_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511005957___m_s_add_heartbeat_8_designer_8cs_source.html b/20200511005957___m_s_add_heartbeat_8_designer_8cs_source.html index e9a23b8cf3..882185c080 100644 --- a/20200511005957___m_s_add_heartbeat_8_designer_8cs_source.html +++ b/20200511005957___m_s_add_heartbeat_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511005957___m_s_add_heartbeat_8cs.html b/20200511005957___m_s_add_heartbeat_8cs.html index 56726e2704..616e324114 100644 --- a/20200511005957___m_s_add_heartbeat_8cs.html +++ b/20200511005957___m_s_add_heartbeat_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511005957___m_s_add_heartbeat_8cs_source.html b/20200511005957___m_s_add_heartbeat_8cs_source.html index eb6e16cb73..fa6ea8c0df 100644 --- a/20200511005957___m_s_add_heartbeat_8cs_source.html +++ b/20200511005957___m_s_add_heartbeat_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511011048___m_y_add_heartbeat_8_designer_8cs.html b/20200511011048___m_y_add_heartbeat_8_designer_8cs.html index a0cca8034e..1e01ccd02f 100644 --- a/20200511011048___m_y_add_heartbeat_8_designer_8cs.html +++ b/20200511011048___m_y_add_heartbeat_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511011048___m_y_add_heartbeat_8_designer_8cs_source.html b/20200511011048___m_y_add_heartbeat_8_designer_8cs_source.html index 1beae15c7e..b654a7c550 100644 --- a/20200511011048___m_y_add_heartbeat_8_designer_8cs_source.html +++ b/20200511011048___m_y_add_heartbeat_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511011048___m_y_add_heartbeat_8cs.html b/20200511011048___m_y_add_heartbeat_8cs.html index 9b8269f671..26d70aabe5 100644 --- a/20200511011048___m_y_add_heartbeat_8cs.html +++ b/20200511011048___m_y_add_heartbeat_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511011048___m_y_add_heartbeat_8cs_source.html b/20200511011048___m_y_add_heartbeat_8cs_source.html index 64879d47b1..bd62a419b5 100644 --- a/20200511011048___m_y_add_heartbeat_8cs_source.html +++ b/20200511011048___m_y_add_heartbeat_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511012117___s_l_add_heartbeat_8_designer_8cs.html b/20200511012117___s_l_add_heartbeat_8_designer_8cs.html index 287a91c5e2..25f7bbf810 100644 --- a/20200511012117___s_l_add_heartbeat_8_designer_8cs.html +++ b/20200511012117___s_l_add_heartbeat_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511012117___s_l_add_heartbeat_8_designer_8cs_source.html b/20200511012117___s_l_add_heartbeat_8_designer_8cs_source.html index 9b66b1bbe3..b186fb0598 100644 --- a/20200511012117___s_l_add_heartbeat_8_designer_8cs_source.html +++ b/20200511012117___s_l_add_heartbeat_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511012117___s_l_add_heartbeat_8cs.html b/20200511012117___s_l_add_heartbeat_8cs.html index 0fc86f9e2b..32bdc979f6 100644 --- a/20200511012117___s_l_add_heartbeat_8cs.html +++ b/20200511012117___s_l_add_heartbeat_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511012117___s_l_add_heartbeat_8cs_source.html b/20200511012117___s_l_add_heartbeat_8cs_source.html index 815de80332..b082403627 100644 --- a/20200511012117___s_l_add_heartbeat_8cs_source.html +++ b/20200511012117___s_l_add_heartbeat_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511162912___s_l_remove_soft_columns_8_designer_8cs.html b/20200511162912___s_l_remove_soft_columns_8_designer_8cs.html index f7ae8204b0..5700b462dd 100644 --- a/20200511162912___s_l_remove_soft_columns_8_designer_8cs.html +++ b/20200511162912___s_l_remove_soft_columns_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511162912___s_l_remove_soft_columns_8_designer_8cs_source.html b/20200511162912___s_l_remove_soft_columns_8_designer_8cs_source.html index af699445d3..890a31a81b 100644 --- a/20200511162912___s_l_remove_soft_columns_8_designer_8cs_source.html +++ b/20200511162912___s_l_remove_soft_columns_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511162912___s_l_remove_soft_columns_8cs.html b/20200511162912___s_l_remove_soft_columns_8cs.html index 61347bd6c2..7aca96bfd9 100644 --- a/20200511162912___s_l_remove_soft_columns_8cs.html +++ b/20200511162912___s_l_remove_soft_columns_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200511162912___s_l_remove_soft_columns_8cs_source.html b/20200511162912___s_l_remove_soft_columns_8cs_source.html index bd7f811937..683ab67880 100644 --- a/20200511162912___s_l_remove_soft_columns_8cs_source.html +++ b/20200511162912___s_l_remove_soft_columns_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512181801___m_s_remove_soft_columns_8_designer_8cs.html b/20200512181801___m_s_remove_soft_columns_8_designer_8cs.html index 8681a098bb..fdbae62168 100644 --- a/20200512181801___m_s_remove_soft_columns_8_designer_8cs.html +++ b/20200512181801___m_s_remove_soft_columns_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512181801___m_s_remove_soft_columns_8_designer_8cs_source.html b/20200512181801___m_s_remove_soft_columns_8_designer_8cs_source.html index 6421bd9299..394f09cf7e 100644 --- a/20200512181801___m_s_remove_soft_columns_8_designer_8cs_source.html +++ b/20200512181801___m_s_remove_soft_columns_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512181801___m_s_remove_soft_columns_8cs.html b/20200512181801___m_s_remove_soft_columns_8cs.html index 92f5e16e6d..f3eae742b8 100644 --- a/20200512181801___m_s_remove_soft_columns_8cs.html +++ b/20200512181801___m_s_remove_soft_columns_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512181801___m_s_remove_soft_columns_8cs_source.html b/20200512181801___m_s_remove_soft_columns_8cs_source.html index 9684b6bdb5..3c05115037 100644 --- a/20200512181801___m_s_remove_soft_columns_8cs_source.html +++ b/20200512181801___m_s_remove_soft_columns_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512182535___m_y_remove_soft_columns_8_designer_8cs.html b/20200512182535___m_y_remove_soft_columns_8_designer_8cs.html index 4e36a3f42a..f2ff1056cd 100644 --- a/20200512182535___m_y_remove_soft_columns_8_designer_8cs.html +++ b/20200512182535___m_y_remove_soft_columns_8_designer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512182535___m_y_remove_soft_columns_8_designer_8cs_source.html b/20200512182535___m_y_remove_soft_columns_8_designer_8cs_source.html index 47cceb5c49..4e1c45d7ce 100644 --- a/20200512182535___m_y_remove_soft_columns_8_designer_8cs_source.html +++ b/20200512182535___m_y_remove_soft_columns_8_designer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512182535___m_y_remove_soft_columns_8cs.html b/20200512182535___m_y_remove_soft_columns_8cs.html index 42409af583..0d732af189 100644 --- a/20200512182535___m_y_remove_soft_columns_8cs.html +++ b/20200512182535___m_y_remove_soft_columns_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/20200512182535___m_y_remove_soft_columns_8cs_source.html b/20200512182535___m_y_remove_soft_columns_8cs_source.html index 20c55b3926..af4458acc6 100644 --- a/20200512182535___m_y_remove_soft_columns_8cs_source.html +++ b/20200512182535___m_y_remove_soft_columns_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_a_p_i_8dox.html b/_a_p_i_8dox.html index 58d9712cf3..4ff1f4c29f 100644 --- a/_a_p_i_8dox.html +++ b/_a_p_i_8dox.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_8cs.html b/_administration_8cs.html index 7bf9cc69eb..b5e1baa831 100644 --- a/_administration_8cs.html +++ b/_administration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_8cs_source.html b/_administration_8cs_source.html index d62351d895..312ddedbe8 100644 --- a/_administration_8cs_source.html +++ b/_administration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_client_8cs.html b/_administration_client_8cs.html index d045783a67..fbaa30de9f 100644 --- a/_administration_client_8cs.html +++ b/_administration_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_client_8cs_source.html b/_administration_client_8cs_source.html index 425e1d081c..58b9163b7f 100644 --- a/_administration_client_8cs_source.html +++ b/_administration_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_controller_8cs.html b/_administration_controller_8cs.html index 79bf9fc408..10b5b5dbaf 100644 --- a/_administration_controller_8cs.html +++ b/_administration_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_controller_8cs_source.html b/_administration_controller_8cs_source.html index 03ca0aee97..6f6d37cd2b 100644 --- a/_administration_controller_8cs_source.html +++ b/_administration_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Api.Models.Administration
Represents administrative server information
Definition: Administration.cs:8
Tgstation.Server.Host.Configuration.UpdatesConfiguration
Configuration for the automatic update system
Definition: UpdatesConfiguration.cs:6
Tgstation.Server.Api.Routes
Routes to a server actions
Definition: Routes.cs:9
-
Tgstation.Server.Host.Database.IDatabaseContext
Represents the database
Definition: IDatabaseContext.cs:13
+
Tgstation.Server.Host.Database.IDatabaseContext
Represents the database.
Definition: IDatabaseContext.cs:13
Tgstation.Server.Host.Controllers.AdministrationController.Update
async Task< IActionResult > Update([FromBody] Administration model, CancellationToken cancellationToken)
Attempt to perform a server upgrade.
Definition: AdministrationController.cs:247
Tgstation.Server.Host.Configuration
Definition: ControlPanelConfiguration.cs:3
Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate
async Task< IActionResult > CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken)
Try to download and apply an update with a given newVersion .
Definition: AdministrationController.cs:123
diff --git a/_administration_rights_8cs.html b/_administration_rights_8cs.html index 28bb19b501..521f64060b 100644 --- a/_administration_rights_8cs.html +++ b/_administration_rights_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_administration_rights_8cs_source.html b/_administration_rights_8cs_source.html index 216e592fec..7027f1a53b 100644 --- a/_administration_rights_8cs_source.html +++ b/_administration_rights_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_client_8cs.html b/_api_client_8cs.html index b724371a83..dc5f64c340 100644 --- a/_api_client_8cs.html +++ b/_api_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_client_8cs_source.html b/_api_client_8cs_source.html index de3d014d41..feef0be38d 100644 --- a/_api_client_8cs_source.html +++ b/_api_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_client_factory_8cs.html b/_api_client_factory_8cs.html index 3c1b627c70..5e0a80efd3 100644 --- a/_api_client_factory_8cs.html +++ b/_api_client_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_client_factory_8cs_source.html b/_api_client_factory_8cs_source.html index 9a3228c238..53083cbc8a 100644 --- a/_api_client_factory_8cs_source.html +++ b/_api_client_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_conflict_exception_8cs.html b/_api_conflict_exception_8cs.html index dd967f199d..16aac9e2ee 100644 --- a/_api_conflict_exception_8cs.html +++ b/_api_conflict_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_conflict_exception_8cs_source.html b/_api_conflict_exception_8cs_source.html index 4818b25db3..4596615a63 100644 --- a/_api_conflict_exception_8cs_source.html +++ b/_api_conflict_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_controller_8cs.html b/_api_controller_8cs.html index 24a157fa12..abe78b72cd 100644 --- a/_api_controller_8cs.html +++ b/_api_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_controller_8cs_source.html b/_api_controller_8cs_source.html index 619fe0df0a..f668490125 100644 --- a/_api_controller_8cs_source.html +++ b/_api_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -107,10 +107,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Api.ApiHeaders.Compatible
bool Compatible()
Checks if the ApiVersion is compatible with Version
Tgstation.Server.Host.Security.IAuthenticationContext
Represents the currently authenticated Api.Models.User
Definition: IAuthenticationContext.cs:10
Tgstation.Server.Api.Models
Definition: Administration.cs:3
-
Tgstation.Server.Host.Database.DatabaseContext
Definition: DatabaseContext.cs:20
+
Tgstation.Server.Host.Database.DatabaseContext
Backend abstract implementation of IDatabaseContext
Definition: DatabaseContext.cs:23
Tgstation.Server.Api.ApiHeaders
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:17
Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser
InstanceUser InstanceUser
Definition: AuthenticationContext.cs:17
-
Tgstation.Server.Host.Database.IDatabaseContext
Represents the database
Definition: IDatabaseContext.cs:13
+
Tgstation.Server.Host.Database.IDatabaseContext
Represents the database.
Definition: IDatabaseContext.cs:13
Controller
Tgstation.Server.Host.Controllers.ApiController
A Controller for API functions
Definition: ApiController.cs:22
Tgstation.Server.Api.ApiHeaders.RawUserAgent
string RawUserAgent
The client&#39;s raw user agent
Definition: ApiHeaders.cs:77
diff --git a/_api_exception_8cs.html b/_api_exception_8cs.html index d578d52601..88546cf94e 100644 --- a/_api_exception_8cs.html +++ b/_api_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_exception_8cs_source.html b/_api_exception_8cs_source.html index 7a2728b148..c0d10df13d 100644 --- a/_api_exception_8cs_source.html +++ b/_api_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_headers_8cs.html b/_api_headers_8cs.html index 526e9da802..6a3f7b6900 100644 --- a/_api_headers_8cs.html +++ b/_api_headers_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_headers_8cs_source.html b/_api_headers_8cs_source.html index da0792f7ec..9d01b7a2fc 100644 --- a/_api_headers_8cs_source.html +++ b/_api_headers_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_validation_status_8cs.html b/_api_validation_status_8cs.html index 866eeffdfb..e5db4c188d 100644 --- a/_api_validation_status_8cs.html +++ b/_api_validation_status_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_api_validation_status_8cs_source.html b/_api_validation_status_8cs_source.html index 54f4511000..52e1eb663e 100644 --- a/_api_validation_status_8cs_source.html +++ b/_api_validation_status_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_application_8cs.html b/_application_8cs.html index fdbefa8bf1..bafeed10ca 100644 --- a/_application_8cs.html +++ b/_application_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_application_8cs_source.html b/_application_8cs_source.html index 0ec1ecaee8..86670930f5 100644 --- a/_application_8cs_source.html +++ b/_application_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Application.cs
-Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Cyberboss.AspNetCore.AsyncInitializer;
3 using Microsoft.AspNetCore.Authentication.JwtBearer;
4 using Microsoft.AspNetCore.Builder;
5 using Microsoft.AspNetCore.Cors.Infrastructure;
6 using Microsoft.AspNetCore.Hosting;
7 using Microsoft.AspNetCore.Identity;
8 using Microsoft.Extensions.Configuration;
9 using Microsoft.Extensions.DependencyInjection;
10 using Microsoft.Extensions.Hosting;
11 using Microsoft.Extensions.Logging;
12 using Microsoft.Extensions.Options;
13 using Microsoft.Extensions.Primitives;
14 using Newtonsoft.Json;
15 using Serilog;
16 using Serilog.Events;
17 using Serilog.Formatting.Display;
18 using System;
19 using System.Globalization;
20 using System.IdentityModel.Tokens.Jwt;
21 using System.Threading.Tasks;
22 using Tgstation.Server.Api;
35 using Tgstation.Server.Host.IO;
40 
41 namespace Tgstation.Server.Host.Core
42 {
46 #pragma warning disable CA1506
48  {
52  readonly IWebHostEnvironment hostingEnvironment;
53 
58 
64  public Application(
65  IConfiguration configuration,
66  IWebHostEnvironment hostingEnvironment)
67  : base(configuration)
68  {
69  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
70  }
71 
76  public static IServerFactory CreateDefaultServerFactory()
77  => new ServerFactory(
79  IOManager);
80 
86  public void ConfigureServices(IServiceCollection services, IPostSetupServices postSetupServices)
87  {
88  ConfigureServices(services);
89 
90  if (postSetupServices == null)
91  throw new ArgumentNullException(nameof(postSetupServices));
92 
93  // configure configuration
94  services.UseStandardConfig<UpdatesConfiguration>(Configuration);
95  services.UseStandardConfig<ControlPanelConfiguration>(Configuration);
96 
97  // enable options which give us config reloading
98  services.AddOptions();
99 
100  static LogEventLevel? ConvertSeriLogLevel(LogLevel logLevel) =>
101  logLevel switch
102  {
103  LogLevel.Critical => LogEventLevel.Fatal,
104  LogLevel.Debug => LogEventLevel.Debug,
105  LogLevel.Error => LogEventLevel.Error,
106  LogLevel.Information => LogEventLevel.Information,
107  LogLevel.Trace => LogEventLevel.Verbose,
108  LogLevel.Warning => LogEventLevel.Warning,
109  LogLevel.None => null,
110  _ => throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel)),
111  };
112 
113  var microsoftEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.MicrosoftLogLevel);
114  services.SetupLogging(
115  config =>
116  {
117  if (microsoftEventLevel.HasValue)
118  config.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
119  },
120  sinkConfig =>
121  {
122  if (postSetupServices.FileLoggingConfiguration.Disable)
123  return;
124 
125  // common app data is C:/ProgramData on windows, else /usr/share
126  var logPath = !String.IsNullOrEmpty(postSetupServices.FileLoggingConfiguration.Directory)
127  ? postSetupServices.FileLoggingConfiguration.Directory
128  : IOManager.ConcatPath(
129  Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
131  "Logs");
132 
133  var logEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.LogLevel);
134 
135  var formatter = new MessageTemplateTextFormatter(
136  "{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}",
137  null);
138 
139  logPath = IOManager.ConcatPath(logPath, "tgs-{Date}.log");
140  var rollingFileConfig = sinkConfig.RollingFile(
141  formatter,
142  logPath,
143  logEventLevel ?? LogEventLevel.Verbose,
144  flushToDiskInterval: TimeSpan.FromSeconds(2));
145  });
146 
147  // configure bearer token validation
148  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
149  {
150  // this line isn't actually run until the first request is made
151  // at that point tokenFactory will be populated
152  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
153  jwtBearerOptions.Events = new JwtBearerEvents
154  {
155  // Application is our composition root so this monstrosity of a line is okay
156  // At least, that's what I tell myself to sleep at night
157  OnTokenValidated = ctx => ctx
158  .HttpContext
159  .RequestServices
160  .GetRequiredService<IClaimsInjector>()
161  .InjectClaimsIntoContext(
162  ctx,
163  ctx.HttpContext.RequestAborted)
164  };
165  });
166 
167  // fucking prevents converting 'sub' to M$ bs
168  // can't be done in the above lambda, that's too late
169  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
170 
171  // add mvc, configure the json serializer settings
172  services
173  .AddMvc(options =>
174  {
175  options.EnableEndpointRouting = false;
176  })
177  .AddNewtonsoftJson(options =>
178  {
179  options.AllowInputFormatterExceptionMessages = true;
180  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
181  options.SerializerSettings.CheckAdditionalContent = true;
182  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
183  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
184  options.SerializerSettings.Converters = new[] { new VersionConverter() };
185  });
186 
187  if (hostingEnvironment.IsDevelopment())
188  {
189  static string GetDocumentationFilePath(string assemblyLocation) => IOManager.ConcatPath(IOManager.GetDirectoryName(assemblyLocation), String.Concat(IOManager.GetFileNameWithoutExtension(assemblyLocation), ".xml"));
190  var assemblyDocumentationPath = GetDocumentationFilePath(typeof(Application).Assembly.Location);
191  var apiDocumentationPath = GetDocumentationFilePath(typeof(ApiHeaders).Assembly.Location);
192  services.AddSwaggerGen(genOptions => SwaggerConfiguration.Configure(genOptions, assemblyDocumentationPath, apiDocumentationPath));
193  services.AddSwaggerGenNewtonsoftSupport();
194  }
195 
196  // enable browser detection
197  services.AddDetectionCore().AddBrowser();
198 
199  // CORS conditionally enabled later
200  services.AddCors();
201 
202  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
203  {
204  services.AddDbContext<TContext>(builder =>
205  {
206  if (hostingEnvironment.IsDevelopment())
207  builder.EnableSensitiveDataLogging();
208  });
209  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
210  }
211 
212  // add the correct database context type
213  var dbType = postSetupServices.DatabaseConfiguration.DatabaseType;
214  switch (dbType)
215  {
216  case DatabaseType.MySql:
217  case DatabaseType.MariaDB:
218  AddTypedContext<MySqlDatabaseContext>();
219  break;
220  case DatabaseType.SqlServer:
221  AddTypedContext<SqlServerDatabaseContext>();
222  break;
223  case DatabaseType.Sqlite:
224  AddTypedContext<SqliteDatabaseContext>();
225  break;
226  default:
227  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
228  }
229 
230  // configure other database services
231  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
232  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
233 
234  // configure security services
236  services.AddScoped<IClaimsInjector, ClaimsInjector>();
237  services.AddSingleton<IIdentityCache, IdentityCache>();
238  services.AddSingleton<ICryptographySuite, CryptographySuite>();
239  services.AddSingleton<ITokenFactory, TokenFactory>();
240  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
241 
242  // configure platform specific services
243  if (postSetupServices.PlatformIdentifier.IsWindows)
244  {
245  if (postSetupServices.GeneralConfiguration.UseBasicWatchdogOnWindows)
246  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
247  else
248  services.AddSingleton<IWatchdogFactory, WindowsWatchdogFactory>();
249 
250  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
251  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
252  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
253  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
254  services.AddSingleton<IProcessFeatures, WindowsProcessFeatures>();
255 
256  services.AddSingleton<WindowsNetworkPromptReaper>();
257  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
258  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
259  }
260  else
261  {
262  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
263  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
264  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
265  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
266  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
267  services.AddSingleton<IProcessFeatures, PosixProcessFeatures>();
268  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
269  }
270 
271  // configure misc services
272  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
273  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
274  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
275  services.AddSingleton<IServerPortProvider, ServerPortProivder>();
276  services.AddSingleton<ITopicClient, TopicClient>();
277  services.AddSingleton(new SocketParameters
278  {
279  ReceiveTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
280  SendTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
281  ConnectTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
282  DisconnectTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout)
283  });
284 
285  // configure component services
286  services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
287  services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
288  services.AddSingleton<IProviderFactory, ProviderFactory>();
289  services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
290  services.AddSingleton<IInstanceFactory, InstanceFactory>();
291 
292  // configure root services
293  services.AddSingleton<IJobManager, JobManager>();
294 
295  services.AddSingleton<InstanceManager>();
296  services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
297  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
298  }
299 
301  protected override void ConfigureHostedService(IServiceCollection services)
302  => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
303 
314  public void Configure(
315  IApplicationBuilder applicationBuilder,
316  IServerControl serverControl,
317  ITokenFactory tokenFactory,
318  IInstanceManager instanceManager,
319  IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
320  IOptions<GeneralConfiguration> generalConfigurationOptions,
321  ILogger<Application> logger)
322  {
323  if (applicationBuilder == null)
324  throw new ArgumentNullException(nameof(applicationBuilder));
325  if (serverControl == null)
326  throw new ArgumentNullException(nameof(serverControl));
327 
328  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
329 
330  var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
331  var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
332 
333  if (logger == null)
334  throw new ArgumentNullException(nameof(logger));
335 
336  logger.LogDebug("Content Root: {0}", hostingEnvironment.ContentRootPath);
337  logger.LogTrace("Web Root: {0}", hostingEnvironment.WebRootPath);
338 
339  if (generalConfiguration.MinimumPasswordLength > Limits.MaximumStringLength)
340  {
341  logger.LogCritical("Configured minimum password length ({0}) is greater than the maximum database string length ({1})!");
342  serverControl.Die(new InvalidOperationException("Minimum password length greater than database limit!"));
343  return;
344  }
345 
346  // attempt to restart the server if the configuration changes
347  if (serverControl.WatchdogPresent)
348  ChangeToken.OnChange(Configuration.GetReloadToken, () => serverControl.Restart());
349 
350  // setup the HTTP request pipeline
351  // Final point where we wrap exceptions in a 500 (ErrorMessage) response
352  applicationBuilder.UseServerErrorHandling();
353 
354  // 503 requests made while the application is starting
355  applicationBuilder.UseAsyncInitialization(async (cancellationToken) =>
356  {
357  var tcs = new TaskCompletionSource<object>();
358  using (cancellationToken.Register(() => tcs.SetCanceled()))
359  await Task.WhenAny(tcs.Task, instanceManager.Ready).ConfigureAwait(false);
360  });
361 
362  // suppress OperationCancelledExceptions, they are just aborted HTTP requests
363  applicationBuilder.UseCancelledRequestSuppression();
364 
365  if (hostingEnvironment.IsDevelopment())
366  {
367  applicationBuilder.UseSwagger();
368  applicationBuilder.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TGS API V4"));
369  logger.LogTrace("Swagger API generation enabled");
370  }
371 
372  // Set up CORS based on configuration if necessary
373  Action<CorsPolicyBuilder> corsBuilder = null;
374  if (controlPanelConfiguration.AllowAnyOrigin)
375  {
376  logger.LogTrace("Access-Control-Allow-Origin: *");
377  corsBuilder = builder => builder.AllowAnyOrigin();
378  }
379  else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
380  {
381  logger.LogTrace("Access-Control-Allow-Origin: ", String.Join(',', controlPanelConfiguration.AllowedOrigins));
382  corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray());
383  }
384 
385  var originalBuilder = corsBuilder;
386  corsBuilder = builder =>
387  {
388  builder.AllowAnyHeader().AllowAnyMethod();
389  originalBuilder?.Invoke(builder);
390  };
391  applicationBuilder.UseCors(corsBuilder);
392 
393  // spa loading if necessary
394  if (controlPanelConfiguration.Enable)
395  {
396  logger.LogWarning("Web control panel enabled. This is a highly WIP feature!");
397  applicationBuilder.UseStaticFiles();
398  }
399  else
400  logger.LogDebug("Web control panel disabled!");
401 
402  // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
403  applicationBuilder.UseAuthentication();
404 
405  // suppress and log database exceptions
406  applicationBuilder.UseDbConflictHandling();
407 
408  // majority of handling is done in the controllers
409  applicationBuilder.UseMvc();
410 
411  // 404 anything that gets this far
412  }
413  }
414 }
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources ...
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Cyberboss.AspNetCore.AsyncInitializer;
3 using Microsoft.AspNetCore.Authentication.JwtBearer;
4 using Microsoft.AspNetCore.Builder;
5 using Microsoft.AspNetCore.Cors.Infrastructure;
6 using Microsoft.AspNetCore.Hosting;
7 using Microsoft.AspNetCore.Identity;
8 using Microsoft.Extensions.Configuration;
9 using Microsoft.Extensions.DependencyInjection;
10 using Microsoft.Extensions.Hosting;
11 using Microsoft.Extensions.Logging;
12 using Microsoft.Extensions.Options;
13 using Microsoft.Extensions.Primitives;
14 using Newtonsoft.Json;
15 using Serilog;
16 using Serilog.Events;
17 using Serilog.Formatting.Display;
18 using System;
19 using System.Globalization;
20 using System.IdentityModel.Tokens.Jwt;
21 using System.Threading.Tasks;
22 using Tgstation.Server.Api;
35 using Tgstation.Server.Host.IO;
40 
41 namespace Tgstation.Server.Host.Core
42 {
46 #pragma warning disable CA1506
48  {
52  readonly IWebHostEnvironment hostingEnvironment;
53 
58 
64  public Application(
65  IConfiguration configuration,
66  IWebHostEnvironment hostingEnvironment)
67  : base(configuration)
68  {
69  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
70  }
71 
76  public static IServerFactory CreateDefaultServerFactory()
77  => new ServerFactory(
79  IOManager);
80 
86  public void ConfigureServices(IServiceCollection services, IPostSetupServices postSetupServices)
87  {
88  ConfigureServices(services);
89 
90  if (postSetupServices == null)
91  throw new ArgumentNullException(nameof(postSetupServices));
92 
93  // configure configuration
94  services.UseStandardConfig<UpdatesConfiguration>(Configuration);
95  services.UseStandardConfig<ControlPanelConfiguration>(Configuration);
96 
97  // enable options which give us config reloading
98  services.AddOptions();
99 
100  static LogEventLevel? ConvertSeriLogLevel(LogLevel logLevel) =>
101  logLevel switch
102  {
103  LogLevel.Critical => LogEventLevel.Fatal,
104  LogLevel.Debug => LogEventLevel.Debug,
105  LogLevel.Error => LogEventLevel.Error,
106  LogLevel.Information => LogEventLevel.Information,
107  LogLevel.Trace => LogEventLevel.Verbose,
108  LogLevel.Warning => LogEventLevel.Warning,
109  LogLevel.None => null,
110  _ => throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel)),
111  };
112 
113  var microsoftEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.MicrosoftLogLevel);
114  services.SetupLogging(
115  config =>
116  {
117  if (microsoftEventLevel.HasValue)
118  config.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
119  },
120  sinkConfig =>
121  {
122  if (postSetupServices.FileLoggingConfiguration.Disable)
123  return;
124 
125  // common app data is C:/ProgramData on windows, else /usr/share
126  var logPath = !String.IsNullOrEmpty(postSetupServices.FileLoggingConfiguration.Directory)
127  ? postSetupServices.FileLoggingConfiguration.Directory
128  : IOManager.ConcatPath(
129  Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
131  "Logs");
132 
133  var logEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.LogLevel);
134 
135  var formatter = new MessageTemplateTextFormatter(
136  "{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}",
137  null);
138 
139  logPath = IOManager.ConcatPath(logPath, "tgs-{Date}.log");
140  var rollingFileConfig = sinkConfig.RollingFile(
141  formatter,
142  logPath,
143  logEventLevel ?? LogEventLevel.Verbose,
144  50 * 1024 * 1024, // 50MB max size
145  flushToDiskInterval: TimeSpan.FromSeconds(2));
146  });
147 
148  // configure bearer token validation
149  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
150  {
151  // this line isn't actually run until the first request is made
152  // at that point tokenFactory will be populated
153  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
154  jwtBearerOptions.Events = new JwtBearerEvents
155  {
156  // Application is our composition root so this monstrosity of a line is okay
157  // At least, that's what I tell myself to sleep at night
158  OnTokenValidated = ctx => ctx
159  .HttpContext
160  .RequestServices
161  .GetRequiredService<IClaimsInjector>()
162  .InjectClaimsIntoContext(
163  ctx,
164  ctx.HttpContext.RequestAborted)
165  };
166  });
167 
168  // fucking prevents converting 'sub' to M$ bs
169  // can't be done in the above lambda, that's too late
170  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
171 
172  // add mvc, configure the json serializer settings
173  services
174  .AddMvc(options =>
175  {
176  options.EnableEndpointRouting = false;
177  })
178  .AddNewtonsoftJson(options =>
179  {
180  options.AllowInputFormatterExceptionMessages = true;
181  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
182  options.SerializerSettings.CheckAdditionalContent = true;
183  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
184  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
185  options.SerializerSettings.Converters = new[] { new VersionConverter() };
186  });
187 
188  if (hostingEnvironment.IsDevelopment())
189  {
190  static string GetDocumentationFilePath(string assemblyLocation) => IOManager.ConcatPath(IOManager.GetDirectoryName(assemblyLocation), String.Concat(IOManager.GetFileNameWithoutExtension(assemblyLocation), ".xml"));
191  var assemblyDocumentationPath = GetDocumentationFilePath(typeof(Application).Assembly.Location);
192  var apiDocumentationPath = GetDocumentationFilePath(typeof(ApiHeaders).Assembly.Location);
193  services.AddSwaggerGen(genOptions => SwaggerConfiguration.Configure(genOptions, assemblyDocumentationPath, apiDocumentationPath));
194  services.AddSwaggerGenNewtonsoftSupport();
195  }
196 
197  // enable browser detection
198  services.AddDetectionCore().AddBrowser();
199 
200  // CORS conditionally enabled later
201  services.AddCors();
202 
203  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
204  {
205  services.AddDbContext<TContext>(builder =>
206  {
207  if (hostingEnvironment.IsDevelopment())
208  builder.EnableSensitiveDataLogging();
209  });
210  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
211  }
212 
213  // add the correct database context type
214  var dbType = postSetupServices.DatabaseConfiguration.DatabaseType;
215  switch (dbType)
216  {
217  case DatabaseType.MySql:
218  case DatabaseType.MariaDB:
219  AddTypedContext<MySqlDatabaseContext>();
220  break;
221  case DatabaseType.SqlServer:
222  AddTypedContext<SqlServerDatabaseContext>();
223  break;
224  case DatabaseType.Sqlite:
225  AddTypedContext<SqliteDatabaseContext>();
226  break;
227  default:
228  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
229  }
230 
231  // configure other database services
232  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
233  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
234 
235  // configure security services
237  services.AddScoped<IClaimsInjector, ClaimsInjector>();
238  services.AddSingleton<IIdentityCache, IdentityCache>();
239  services.AddSingleton<ICryptographySuite, CryptographySuite>();
240  services.AddSingleton<ITokenFactory, TokenFactory>();
241  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
242 
243  // configure platform specific services
244  if (postSetupServices.PlatformIdentifier.IsWindows)
245  {
246  if (postSetupServices.GeneralConfiguration.UseBasicWatchdogOnWindows)
247  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
248  else
249  services.AddSingleton<IWatchdogFactory, WindowsWatchdogFactory>();
250 
251  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
252  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
253  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
254  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
255  services.AddSingleton<IProcessFeatures, WindowsProcessFeatures>();
256 
257  services.AddSingleton<WindowsNetworkPromptReaper>();
258  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
259  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
260  }
261  else
262  {
263  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
264  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
265  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
266  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
267  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
268  services.AddSingleton<IProcessFeatures, PosixProcessFeatures>();
269  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
270  }
271 
272  // configure misc services
273  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
274  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
275  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
276  services.AddSingleton<IServerPortProvider, ServerPortProivder>();
277  services.AddSingleton<ITopicClient, TopicClient>();
278  services.AddSingleton(new SocketParameters
279  {
280  ReceiveTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
281  SendTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
282  ConnectTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout),
283  DisconnectTimeout = TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.ByondTopicTimeout)
284  });
285 
286  // configure component services
287  services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
288  services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
289  services.AddSingleton<IProviderFactory, ProviderFactory>();
290  services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
291  services.AddSingleton<IInstanceFactory, InstanceFactory>();
292 
293  // configure root services
294  services.AddSingleton<IJobManager, JobManager>();
295 
296  services.AddSingleton<InstanceManager>();
297  services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
298  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
299  }
300 
302  protected override void ConfigureHostedService(IServiceCollection services)
303  => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
304 
315  public void Configure(
316  IApplicationBuilder applicationBuilder,
317  IServerControl serverControl,
318  ITokenFactory tokenFactory,
319  IInstanceManager instanceManager,
320  IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
321  IOptions<GeneralConfiguration> generalConfigurationOptions,
322  ILogger<Application> logger)
323  {
324  if (applicationBuilder == null)
325  throw new ArgumentNullException(nameof(applicationBuilder));
326  if (serverControl == null)
327  throw new ArgumentNullException(nameof(serverControl));
328 
329  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
330 
331  var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
332  var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
333 
334  if (logger == null)
335  throw new ArgumentNullException(nameof(logger));
336 
337  logger.LogDebug("Content Root: {0}", hostingEnvironment.ContentRootPath);
338  logger.LogTrace("Web Root: {0}", hostingEnvironment.WebRootPath);
339 
340  if (generalConfiguration.MinimumPasswordLength > Limits.MaximumStringLength)
341  {
342  logger.LogCritical("Configured minimum password length ({0}) is greater than the maximum database string length ({1})!");
343  serverControl.Die(new InvalidOperationException("Minimum password length greater than database limit!"));
344  return;
345  }
346 
347  // attempt to restart the server if the configuration changes
348  if (serverControl.WatchdogPresent)
349  ChangeToken.OnChange(Configuration.GetReloadToken, () => serverControl.Restart());
350 
351  // setup the HTTP request pipeline
352  // Final point where we wrap exceptions in a 500 (ErrorMessage) response
353  applicationBuilder.UseServerErrorHandling();
354 
355  // 503 requests made while the application is starting
356  applicationBuilder.UseAsyncInitialization(async (cancellationToken) =>
357  {
358  var tcs = new TaskCompletionSource<object>();
359  using (cancellationToken.Register(() => tcs.SetCanceled()))
360  await Task.WhenAny(tcs.Task, instanceManager.Ready).ConfigureAwait(false);
361  });
362 
363  // suppress OperationCancelledExceptions, they are just aborted HTTP requests
364  applicationBuilder.UseCancelledRequestSuppression();
365 
366  if (hostingEnvironment.IsDevelopment())
367  {
368  applicationBuilder.UseSwagger();
369  applicationBuilder.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TGS API V4"));
370  logger.LogTrace("Swagger API generation enabled");
371  }
372 
373  // Set up CORS based on configuration if necessary
374  Action<CorsPolicyBuilder> corsBuilder = null;
375  if (controlPanelConfiguration.AllowAnyOrigin)
376  {
377  logger.LogTrace("Access-Control-Allow-Origin: *");
378  corsBuilder = builder => builder.AllowAnyOrigin();
379  }
380  else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
381  {
382  logger.LogTrace("Access-Control-Allow-Origin: ", String.Join(',', controlPanelConfiguration.AllowedOrigins));
383  corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray());
384  }
385 
386  var originalBuilder = corsBuilder;
387  corsBuilder = builder =>
388  {
389  builder.AllowAnyHeader().AllowAnyMethod();
390  originalBuilder?.Invoke(builder);
391  };
392  applicationBuilder.UseCors(corsBuilder);
393 
394  // spa loading if necessary
395  if (controlPanelConfiguration.Enable)
396  {
397  logger.LogWarning("Web control panel enabled. This is a highly WIP feature!");
398  applicationBuilder.UseStaticFiles();
399  }
400  else
401  logger.LogDebug("Web control panel disabled!");
402 
403  // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
404  applicationBuilder.UseAuthentication();
405 
406  // suppress and log database exceptions
407  applicationBuilder.UseDbConflictHandling();
408 
409  // majority of handling is done in the controllers
410  applicationBuilder.UseMvc();
411 
412  // 404 anything that gets this far
413  }
414  }
415 }
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources ...
@@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Contains various cryptographic functions
- +
Backend abstract implementation of IDatabaseContext
Application(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
Construct an Application
Definition: Application.cs:64
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:17
@@ -150,11 +150,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Configuration for the automatic update system
For downloading and installing BYOND extractions for a given system
-
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IInstanceManager instanceManager, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< Application > logger)
Configure the Application
Definition: Application.cs:314
+
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IInstanceManager instanceManager, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< Application > logger)
Configure the Application
Definition: Application.cs:315
For accessing the disk in a synchronous manner
DatabaseType DatabaseType
The Configuration.DatabaseType to create
- + diff --git a/_application_builder_extensions_8cs.html b/_application_builder_extensions_8cs.html index 842d19e425..3409a26ad7 100644 --- a/_application_builder_extensions_8cs.html +++ b/_application_builder_extensions_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_application_builder_extensions_8cs_source.html b/_application_builder_extensions_8cs_source.html index 22b8654f82..c05e71c642 100644 --- a/_application_builder_extensions_8cs_source.html +++ b/_application_builder_extensions_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_architecture_8dox.html b/_architecture_8dox.html index de739f499b..fb81586ae5 100644 --- a/_architecture_8dox.html +++ b/_architecture_8dox.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_assembly_information_provider_8cs.html b/_assembly_information_provider_8cs.html index bbb99d84c3..9f6d57a561 100644 --- a/_assembly_information_provider_8cs.html +++ b/_assembly_information_provider_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_assembly_information_provider_8cs_source.html b/_assembly_information_provider_8cs_source.html index 23a8fea4b4..4c9c07779e 100644 --- a/_assembly_information_provider_8cs_source.html +++ b/_assembly_information_provider_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_async_delayer_8cs.html b/_async_delayer_8cs.html index d39f1846b4..e885ba09f6 100644 --- a/_async_delayer_8cs.html +++ b/_async_delayer_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_async_delayer_8cs_source.html b/_async_delayer_8cs_source.html index 808403a47f..ad6f3ae1f7 100644 --- a/_async_delayer_8cs_source.html +++ b/_async_delayer_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_authentication_context_8cs.html b/_authentication_context_8cs.html index ba1a7b2a86..70a4351c91 100644 --- a/_authentication_context_8cs.html +++ b/_authentication_context_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_authentication_context_8cs_source.html b/_authentication_context_8cs_source.html index ce23caa09b..95b24bc648 100644 --- a/_authentication_context_8cs_source.html +++ b/_authentication_context_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_authentication_context_factory_8cs.html b/_authentication_context_factory_8cs.html index 94be789334..e43767fb88 100644 --- a/_authentication_context_factory_8cs.html +++ b/_authentication_context_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_authentication_context_factory_8cs_source.html b/_authentication_context_factory_8cs_source.html index 43fd2850b2..326a350320 100644 --- a/_authentication_context_factory_8cs_source.html +++ b/_authentication_context_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Represents the currently authenticated Api.Models.User
- +
readonly IIdentityCache identityCache
The IIdentityCache for the AuthenticationContextFactory
diff --git a/_basic_watchdog_8cs.html b/_basic_watchdog_8cs.html index c642859980..4f409004b0 100644 --- a/_basic_watchdog_8cs.html +++ b/_basic_watchdog_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_basic_watchdog_8cs_source.html b/_basic_watchdog_8cs_source.html index fad8c089dc..13ccc03eba 100644 --- a/_basic_watchdog_8cs_source.html +++ b/_basic_watchdog_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bool_converter_8cs.html b/_bool_converter_8cs.html index 2ed818f344..2a746ae185 100644 --- a/_bool_converter_8cs.html +++ b/_bool_converter_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bool_converter_8cs_source.html b/_bool_converter_8cs_source.html index 7c0c80ac78..f4d8d21ac9 100644 --- a/_bool_converter_8cs_source.html +++ b/_bool_converter_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_command_type_8cs.html b/_bridge_command_type_8cs.html index 194ad5785a..6832b10a74 100644 --- a/_bridge_command_type_8cs.html +++ b/_bridge_command_type_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_command_type_8cs_source.html b/_bridge_command_type_8cs_source.html index b1798e72fb..f6f883dffe 100644 --- a/_bridge_command_type_8cs_source.html +++ b/_bridge_command_type_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_controller_8cs.html b/_bridge_controller_8cs.html index 22bcdd9ce1..3677d370c1 100644 --- a/_bridge_controller_8cs.html +++ b/_bridge_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_controller_8cs_source.html b/_bridge_controller_8cs_source.html index 6b5e5547f3..31b2606a4c 100644 --- a/_bridge_controller_8cs_source.html +++ b/_bridge_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_parameters_8cs.html b/_bridge_parameters_8cs.html index 94e835f71c..b3cf77da13 100644 --- a/_bridge_parameters_8cs.html +++ b/_bridge_parameters_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_parameters_8cs_source.html b/_bridge_parameters_8cs_source.html index 89b5acde23..39193d8486 100644 --- a/_bridge_parameters_8cs_source.html +++ b/_bridge_parameters_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_registration_8cs.html b/_bridge_registration_8cs.html index f7da6e7a00..12511251a0 100644 --- a/_bridge_registration_8cs.html +++ b/_bridge_registration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_registration_8cs_source.html b/_bridge_registration_8cs_source.html index 757f503a85..f1a8d3f430 100644 --- a/_bridge_registration_8cs_source.html +++ b/_bridge_registration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_response_8cs.html b/_bridge_response_8cs.html index 6ec25ca4af..6890743778 100644 --- a/_bridge_response_8cs.html +++ b/_bridge_response_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_bridge_response_8cs_source.html b/_bridge_response_8cs_source.html index 38b8d81581..06d046cda7 100644 --- a/_bridge_response_8cs_source.html +++ b/_bridge_response_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_8cs.html b/_byond_8cs.html index 67d6f97c29..462d0ba988 100644 --- a/_byond_8cs.html +++ b/_byond_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_8cs_source.html b/_byond_8cs_source.html index 471330f3bb..236547590d 100644 --- a/_byond_8cs_source.html +++ b/_byond_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_client_8cs.html b/_byond_client_8cs.html index c133f94064..c808268507 100644 --- a/_byond_client_8cs.html +++ b/_byond_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_client_8cs_source.html b/_byond_client_8cs_source.html index 317d467b49..b807556254 100644 --- a/_byond_client_8cs_source.html +++ b/_byond_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_command_8cs.html b/_byond_command_8cs.html index 5f7a872df9..fb834a84f7 100644 --- a/_byond_command_8cs.html +++ b/_byond_command_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_command_8cs_source.html b/_byond_command_8cs_source.html index 98324b5b15..544935556b 100644 --- a/_byond_command_8cs_source.html +++ b/_byond_command_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_controller_8cs.html b/_byond_controller_8cs.html index 5c5c396d8f..d9fa5072df 100644 --- a/_byond_controller_8cs.html +++ b/_byond_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_controller_8cs_source.html b/_byond_controller_8cs_source.html index 6f69c8c583..cd9f849aab 100644 --- a/_byond_controller_8cs_source.html +++ b/_byond_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
readonly IJobManager jobManager
The IJobManager for the ByondController
Routes to a server actions
Definition: Routes.cs:9
- +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger< ByondController > logger)
Construct a ByondController
diff --git a/_byond_executable_lock_8cs.html b/_byond_executable_lock_8cs.html index 63e5ca1b6f..e2607b63da 100644 --- a/_byond_executable_lock_8cs.html +++ b/_byond_executable_lock_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_executable_lock_8cs_source.html b/_byond_executable_lock_8cs_source.html index d0b5f28605..868d2b8752 100644 --- a/_byond_executable_lock_8cs_source.html +++ b/_byond_executable_lock_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_installer_base_8cs.html b/_byond_installer_base_8cs.html index d2e1c7d9cc..709f661621 100644 --- a/_byond_installer_base_8cs.html +++ b/_byond_installer_base_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_installer_base_8cs_source.html b/_byond_installer_base_8cs_source.html index 2b83b72d5a..0b00e58141 100644 --- a/_byond_installer_base_8cs_source.html +++ b/_byond_installer_base_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_manager_8cs.html b/_byond_manager_8cs.html index 56e0d1abf7..0f90610fb0 100644 --- a/_byond_manager_8cs.html +++ b/_byond_manager_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_manager_8cs_source.html b/_byond_manager_8cs_source.html index a340ea9a34..5e8d1d2b0b 100644 --- a/_byond_manager_8cs_source.html +++ b/_byond_manager_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_rights_8cs.html b/_byond_rights_8cs.html index ad8211f977..b6aba51686 100644 --- a/_byond_rights_8cs.html +++ b/_byond_rights_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_byond_rights_8cs_source.html b/_byond_rights_8cs_source.html index 1795279252..2afd3b717d 100644 --- a/_byond_rights_8cs_source.html +++ b/_byond_rights_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_channel_mapping_8cs.html b/_channel_mapping_8cs.html index b761634b65..2c0485c805 100644 --- a/_channel_mapping_8cs.html +++ b/_channel_mapping_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_channel_mapping_8cs_source.html b/_channel_mapping_8cs_source.html index 9212c734b0..819d7a3299 100644 --- a/_channel_mapping_8cs_source.html +++ b/_channel_mapping_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_channel_representation_8cs.html b/_channel_representation_8cs.html index d165048eaa..20d1d85f88 100644 --- a/_channel_representation_8cs.html +++ b/_channel_representation_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_channel_representation_8cs_source.html b/_channel_representation_8cs_source.html index 16809d90e1..0a473d1338 100644 --- a/_channel_representation_8cs_source.html +++ b/_channel_representation_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_bot_rights_8cs.html b/_chat_bot_rights_8cs.html index 1db1c1d562..778b6363c9 100644 --- a/_chat_bot_rights_8cs.html +++ b/_chat_bot_rights_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_bot_rights_8cs_source.html b/_chat_bot_rights_8cs_source.html index 4ed5e8b650..7366fd7c98 100644 --- a/_chat_bot_rights_8cs_source.html +++ b/_chat_bot_rights_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_bots_client_8cs.html b/_chat_bots_client_8cs.html index 2e58cee73f..cef2bf2464 100644 --- a/_chat_bots_client_8cs.html +++ b/_chat_bots_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_bots_client_8cs_source.html b/_chat_bots_client_8cs_source.html index 75ecc31c34..0f20b03e00 100644 --- a/_chat_bots_client_8cs_source.html +++ b/_chat_bots_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_channel_extensions_8cs.html b/_chat_channel_extensions_8cs.html index ff5253ced1..997b3bbcb7 100644 --- a/_chat_channel_extensions_8cs.html +++ b/_chat_channel_extensions_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_channel_extensions_8cs_source.html b/_chat_channel_extensions_8cs_source.html index 95a038e4e2..acc00bfdbf 100644 --- a/_chat_channel_extensions_8cs_source.html +++ b/_chat_channel_extensions_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_command_8cs.html b/_chat_command_8cs.html index cbcae9f22b..14cb4c7c53 100644 --- a/_chat_command_8cs.html +++ b/_chat_command_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_command_8cs_source.html b/_chat_command_8cs_source.html index a0b97b4150..ae95d43720 100644 --- a/_chat_command_8cs_source.html +++ b/_chat_command_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_connection_string_builder_8cs.html b/_chat_connection_string_builder_8cs.html index e368e242ff..d38ed1208f 100644 --- a/_chat_connection_string_builder_8cs.html +++ b/_chat_connection_string_builder_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_connection_string_builder_8cs_source.html b/_chat_connection_string_builder_8cs_source.html index 3ada38d26e..8336805e70 100644 --- a/_chat_connection_string_builder_8cs_source.html +++ b/_chat_connection_string_builder_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_controller_8cs.html b/_chat_controller_8cs.html index 8d7c2909a9..536e4a1ed0 100644 --- a/_chat_controller_8cs.html +++ b/_chat_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_controller_8cs_source.html b/_chat_controller_8cs_source.html index 766fabd419..bf0b2978c5 100644 --- a/_chat_controller_8cs_source.html +++ b/_chat_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -107,12 +107,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
IActionResult StandardModelChecks(Api.Models.ChatBot model, bool forCreation)
Perform some basic validation of a given model .
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
- +
Backend abstract implementation of IDatabaseContext
ushort ChatBotLimit
The maximum number of ChatBots the Instance may contain.
Definition: Instance.cs:52
Routes to a server actions
Definition: Routes.cs:9
async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete a Api.Models.ChatBot.
ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger< ChatController > logger)
Construct a ChatController
- +
async Task< IActionResult > List(CancellationToken cancellationToken)
List Api.Models.ChatBots.
async Task< IActionResult > Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
Updates a chat bot model .
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
@@ -126,14 +126,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ApiController for managing Api.Models.ChatBots
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
-
DbSet< ChatChannel > ChatChannels
The ChatChannels in the DatabaseContext<TParentContext>.
+
DbSet< ChatChannel > ChatChannels
The ChatChannels in the DatabaseContext<TParentContext>.
const string List
The postfix for list operations
Definition: Routes.cs:84
async Task< IActionResult > Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
Create a new chat bot model .
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
Represents an error message returned by the server
Definition: ErrorMessage.cs:9
async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific Api.Models.ChatBot.
-
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext<TParentContext>.
+
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext<TParentContext>.
diff --git a/_chat_manager_8cs.html b/_chat_manager_8cs.html index 2897cecd52..85b765265a 100644 --- a/_chat_manager_8cs.html +++ b/_chat_manager_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_manager_8cs_source.html b/_chat_manager_8cs_source.html index e776518512..71691e2f30 100644 --- a/_chat_manager_8cs_source.html +++ b/_chat_manager_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_manager_factory_8cs.html b/_chat_manager_factory_8cs.html index c388acbc90..5eea19d983 100644 --- a/_chat_manager_factory_8cs.html +++ b/_chat_manager_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_manager_factory_8cs_source.html b/_chat_manager_factory_8cs_source.html index 9eb4a51c77..5a85e52c2a 100644 --- a/_chat_manager_factory_8cs_source.html +++ b/_chat_manager_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_message_8cs.html b/_chat_message_8cs.html index 792a6391db..6ab8659bc3 100644 --- a/_chat_message_8cs.html +++ b/_chat_message_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_message_8cs_source.html b/_chat_message_8cs_source.html index 771879148c..edb7df5133 100644 --- a/_chat_message_8cs_source.html +++ b/_chat_message_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_provider_8cs.html b/_chat_provider_8cs.html index 643573d29a..259398db80 100644 --- a/_chat_provider_8cs.html +++ b/_chat_provider_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_provider_8cs_source.html b/_chat_provider_8cs_source.html index 6470467afe..7bb8425267 100644 --- a/_chat_provider_8cs_source.html +++ b/_chat_provider_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_tracking_context_8cs.html b/_chat_tracking_context_8cs.html index 7bada10e47..524830366a 100644 --- a/_chat_tracking_context_8cs.html +++ b/_chat_tracking_context_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_tracking_context_8cs_source.html b/_chat_tracking_context_8cs_source.html index a54c474007..a79bfdc0ca 100644 --- a/_chat_tracking_context_8cs_source.html +++ b/_chat_tracking_context_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_update_8cs.html b/_chat_update_8cs.html index 189d67e151..b78951932a 100644 --- a/_chat_update_8cs.html +++ b/_chat_update_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_update_8cs_source.html b/_chat_update_8cs_source.html index 8849d6acda..93d29bdc88 100644 --- a/_chat_update_8cs_source.html +++ b/_chat_update_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_user_8cs.html b/_chat_user_8cs.html index 26e1ab0c09..b85ba5a83e 100644 --- a/_chat_user_8cs.html +++ b/_chat_user_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_chat_user_8cs_source.html b/_chat_user_8cs_source.html index 7a1c569449..09e7d4faea 100644 --- a/_chat_user_8cs_source.html +++ b/_chat_user_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_claims_injector_8cs.html b/_claims_injector_8cs.html index e84de62ae7..83918ccd36 100644 --- a/_claims_injector_8cs.html +++ b/_claims_injector_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_claims_injector_8cs_source.html b/_claims_injector_8cs_source.html index e29e3896f8..4896d328d3 100644 --- a/_claims_injector_8cs_source.html +++ b/_claims_injector_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_client_exception_8cs.html b/_client_exception_8cs.html index 8ea0921bf9..3e228d8642 100644 --- a/_client_exception_8cs.html +++ b/_client_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_client_exception_8cs_source.html b/_client_exception_8cs_source.html index d812bb7099..997ed597ba 100644 --- a/_client_exception_8cs_source.html +++ b/_client_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_combined_topic_response_8cs.html b/_combined_topic_response_8cs.html index d636553c08..6cf6f9abbd 100644 --- a/_combined_topic_response_8cs.html +++ b/_combined_topic_response_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_combined_topic_response_8cs_source.html b/_combined_topic_response_8cs_source.html index 6164bd6778..d185baa3ee 100644 --- a/_combined_topic_response_8cs_source.html +++ b/_combined_topic_response_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_command_factory_8cs.html b/_command_factory_8cs.html index 6f024be548..cef91250bf 100644 --- a/_command_factory_8cs.html +++ b/_command_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_command_factory_8cs_source.html b/_command_factory_8cs_source.html index 286bac153f..b4b94f6123 100644 --- a/_command_factory_8cs_source.html +++ b/_command_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_session_2_dual_reattach_information_8cs.html b/_components_2_session_2_dual_reattach_information_8cs.html index ef58e80a88..ff27d50ee4 100644 --- a/_components_2_session_2_dual_reattach_information_8cs.html +++ b/_components_2_session_2_dual_reattach_information_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_session_2_dual_reattach_information_8cs_source.html b/_components_2_session_2_dual_reattach_information_8cs_source.html index 7e09431bfa..9e5dfe2a04 100644 --- a/_components_2_session_2_dual_reattach_information_8cs_source.html +++ b/_components_2_session_2_dual_reattach_information_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_session_2_reattach_information_8cs.html b/_components_2_session_2_reattach_information_8cs.html index d5a36a3e35..02498c7c88 100644 --- a/_components_2_session_2_reattach_information_8cs.html +++ b/_components_2_session_2_reattach_information_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_session_2_reattach_information_8cs_source.html b/_components_2_session_2_reattach_information_8cs_source.html index 78649659f7..5408c9c439 100644 --- a/_components_2_session_2_reattach_information_8cs_source.html +++ b/_components_2_session_2_reattach_information_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_i_watchdog_8cs.html b/_components_2_watchdog_2_i_watchdog_8cs.html index 8c5a6e9e81..a1516e064c 100644 --- a/_components_2_watchdog_2_i_watchdog_8cs.html +++ b/_components_2_watchdog_2_i_watchdog_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_i_watchdog_8cs_source.html b/_components_2_watchdog_2_i_watchdog_8cs_source.html index 56ffe82f52..4922c66e13 100644 --- a/_components_2_watchdog_2_i_watchdog_8cs_source.html +++ b/_components_2_watchdog_2_i_watchdog_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_i_watchdog_factory_8cs.html b/_components_2_watchdog_2_i_watchdog_factory_8cs.html index d5039175cb..e5e6f55c98 100644 --- a/_components_2_watchdog_2_i_watchdog_factory_8cs.html +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html b/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html index e84cda58c9..ed6fac8e0c 100644 --- a/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_watchdog_factory_8cs.html b/_components_2_watchdog_2_watchdog_factory_8cs.html index 7fec9e59b8..da664d70aa 100644 --- a/_components_2_watchdog_2_watchdog_factory_8cs.html +++ b/_components_2_watchdog_2_watchdog_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_components_2_watchdog_2_watchdog_factory_8cs_source.html b/_components_2_watchdog_2_watchdog_factory_8cs_source.html index 71c56ecafb..b974e97a1a 100644 --- a/_components_2_watchdog_2_watchdog_factory_8cs_source.html +++ b/_components_2_watchdog_2_watchdog_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_8cs.html b/_configuration_8cs.html index bdbde302c8..317679feb3 100644 --- a/_configuration_8cs.html +++ b/_configuration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_8cs_source.html b/_configuration_8cs_source.html index 8e692b5e3c..5c0b9b45a5 100644 --- a/_configuration_8cs_source.html +++ b/_configuration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_client_8cs.html b/_configuration_client_8cs.html index e02125878d..cbbaf36481 100644 --- a/_configuration_client_8cs.html +++ b/_configuration_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_client_8cs_source.html b/_configuration_client_8cs_source.html index 93cad1f830..6ecf048106 100644 --- a/_configuration_client_8cs_source.html +++ b/_configuration_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_controller_8cs.html b/_configuration_controller_8cs.html index a5abb2d3ea..985616b634 100644 --- a/_configuration_controller_8cs.html +++ b/_configuration_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_controller_8cs_source.html b/_configuration_controller_8cs_source.html index b0033a89cf..643fd83786 100644 --- a/_configuration_controller_8cs_source.html +++ b/_configuration_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
The ApiController for ConfigurationFiles
Routes to a server actions
Definition: Routes.cs:9
readonly IIOManager ioManager
The IIOManager for the ConfigurationController
-
Represents the database
+
Represents the database.
A Controller for API functions
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
diff --git a/_configuration_file_8cs.html b/_configuration_file_8cs.html index 14ac0eb0fd..72dc532898 100644 --- a/_configuration_file_8cs.html +++ b/_configuration_file_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_file_8cs_source.html b/_configuration_file_8cs_source.html index 8eda074420..4a8b30f7c4 100644 --- a/_configuration_file_8cs_source.html +++ b/_configuration_file_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_rights_8cs.html b/_configuration_rights_8cs.html index f5b2c5d469..7e642651a5 100644 --- a/_configuration_rights_8cs.html +++ b/_configuration_rights_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_rights_8cs_source.html b/_configuration_rights_8cs_source.html index 779cf489be..5696b3d53b 100644 --- a/_configuration_rights_8cs_source.html +++ b/_configuration_rights_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_type_8cs.html b/_configuration_type_8cs.html index 0aaa86b134..4ffbfb2420 100644 --- a/_configuration_type_8cs.html +++ b/_configuration_type_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_configuration_type_8cs_source.html b/_configuration_type_8cs_source.html index fe061388f4..1ec4251466 100644 --- a/_configuration_type_8cs_source.html +++ b/_configuration_type_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_conflict_exception_8cs.html b/_conflict_exception_8cs.html index 2add8e1632..2de5ed988f 100644 --- a/_conflict_exception_8cs.html +++ b/_conflict_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_conflict_exception_8cs_source.html b/_conflict_exception_8cs_source.html index 19127eb03b..1a928831ef 100644 --- a/_conflict_exception_8cs_source.html +++ b/_conflict_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_console_2_program_8cs.html b/_console_2_program_8cs.html new file mode 100644 index 0000000000..5b796ccaad --- /dev/null +++ b/_console_2_program_8cs.html @@ -0,0 +1,122 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/Program.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Program.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Console.Program
 Contains the entrypoint for the application More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Console
 
+
+ + + + diff --git a/_console_2_program_8cs_source.html b/_console_2_program_8cs_source.html new file mode 100644 index 0000000000..c9dbbdfbb0 --- /dev/null +++ b/_console_2_program_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/Program.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Program.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Threading;
5 using System.Threading.Tasks;
7 
8 namespace Tgstation.Server.Host.Console
9 {
13  static class Program
14  {
18  internal static IWatchdogFactory WatchdogFactory { get; set; } = new WatchdogFactory();
19 
25  internal static async Task Main(string[] args)
26  {
27  using (var loggerFactory = new LoggerFactory())
28  {
29  var arguments = new List<string>(args);
30  var trace = arguments.Remove("--trace-host-watchdog");
31  var debug = arguments.Remove("--debug-host-watchdog");
32 
33 #pragma warning disable CS0618 // Type or member is obsolete
34  loggerFactory.AddConsole(trace ? LogLevel.Trace : debug ? LogLevel.Debug : LogLevel.Information, true);
35 #pragma warning restore CS0618 // Type or member is obsolete
36 
37  if (trace && debug)
38  {
39  loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!");
40  return;
41  }
42 
43  using (var cts = new CancellationTokenSource())
44  {
45  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
46  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
47  try
48  {
49  System.Console.CancelKeyPress += (a, b) =>
50  {
51  b.Cancel = true;
52  cts.Cancel();
53  };
54  await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(false, arguments.ToArray(), cts.Token).ConfigureAwait(false);
55  }
56  finally
57  {
58  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
59  }
60  }
61  }
62  }
63  }
64 }
Contains the entrypoint for the application
Definition: Program.cs:13
+ +
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+ +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ + + + + + +
+ + + + diff --git a/_console_8cs.html b/_console_8cs.html index f1f08c0c78..bee4a3fabc 100644 --- a/_console_8cs.html +++ b/_console_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_console_8cs_source.html b/_console_8cs_source.html index 7ad2ef04ce..560809a932 100644 --- a/_console_8cs_source.html +++ b/_console_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_control_panel_configuration_8cs.html b/_control_panel_configuration_8cs.html index a57fd13fe5..ff5594cd3b 100644 --- a/_control_panel_configuration_8cs.html +++ b/_control_panel_configuration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_control_panel_configuration_8cs_source.html b/_control_panel_configuration_8cs_source.html index 9fdf05b345..efdf41ca85 100644 --- a/_control_panel_configuration_8cs_source.html +++ b/_control_panel_configuration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_cryptography_suite_8cs.html b/_cryptography_suite_8cs.html index c8b9ba4178..a7067361c2 100644 --- a/_cryptography_suite_8cs.html +++ b/_cryptography_suite_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_cryptography_suite_8cs_source.html b/_cryptography_suite_8cs_source.html index 6469686a9f..0c009ab2e1 100644 --- a/_cryptography_suite_8cs_source.html +++ b/_cryptography_suite_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_custom_command_8cs.html b/_custom_command_8cs.html index 8522905658..670e246841 100644 --- a/_custom_command_8cs.html +++ b/_custom_command_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_custom_command_8cs_source.html b/_custom_command_8cs_source.html index e215dd6368..03fb40f677 100644 --- a/_custom_command_8cs_source.html +++ b/_custom_command_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_constants_8cs.html b/_d_m_api_constants_8cs.html index c32d222ef1..ab858e4916 100644 --- a/_d_m_api_constants_8cs.html +++ b/_d_m_api_constants_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_constants_8cs_source.html b/_d_m_api_constants_8cs_source.html index 86046e7885..2571f9599b 100644 --- a/_d_m_api_constants_8cs_source.html +++ b/_d_m_api_constants_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_parameters_8cs.html b/_d_m_api_parameters_8cs.html index 24e81760e3..36edf24111 100644 --- a/_d_m_api_parameters_8cs.html +++ b/_d_m_api_parameters_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_parameters_8cs_source.html b/_d_m_api_parameters_8cs_source.html index a4f16bd2f5..ca4ab80e72 100644 --- a/_d_m_api_parameters_8cs_source.html +++ b/_d_m_api_parameters_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_response_8cs.html b/_d_m_api_response_8cs.html index cd0a570e4a..6d40f328a4 100644 --- a/_d_m_api_response_8cs.html +++ b/_d_m_api_response_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_d_m_api_response_8cs_source.html b/_d_m_api_response_8cs_source.html index d0a910f524..d2fe89b5dc 100644 --- a/_d_m_api_response_8cs_source.html +++ b/_d_m_api_response_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_collection_8cs.html b/_database_collection_8cs.html index 2c4d552fb1..ff42bff6c0 100644 --- a/_database_collection_8cs.html +++ b/_database_collection_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_collection_8cs_source.html b/_database_collection_8cs_source.html index 5588e4e9c1..ac16a63113 100644 --- a/_database_collection_8cs_source.html +++ b/_database_collection_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_configuration_8cs.html b/_database_configuration_8cs.html index efa6cc5af1..44e409b30e 100644 --- a/_database_configuration_8cs.html +++ b/_database_configuration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_configuration_8cs_source.html b/_database_configuration_8cs_source.html index 682709e6fb..835196cc7d 100644 --- a/_database_configuration_8cs_source.html +++ b/_database_configuration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_connection_factory_8cs.html b/_database_connection_factory_8cs.html index 5add5fe069..5fbe6b9375 100644 --- a/_database_connection_factory_8cs.html +++ b/_database_connection_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_connection_factory_8cs_source.html b/_database_connection_factory_8cs_source.html index 7a576a735f..dd194fa4bb 100644 --- a/_database_connection_factory_8cs_source.html +++ b/_database_connection_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_database_context_8cs.html b/_database_context_8cs.html index a0fe045613..b0ea514e50 100644 --- a/_database_context_8cs.html +++ b/_database_context_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -103,6 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

Classes

class  Tgstation.Server.Host.Database.DatabaseContext< TParentContext > + Backend abstract implementation of IDatabaseContext More...
  @@ -94,60 +94,60 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DatabaseContext.cs
-Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.EntityFrameworkCore.Infrastructure;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Logging;
6 using Microsoft.Extensions.Options;
7 using System;
8 using System.Globalization;
9 using System.Linq;
10 using System.Threading;
11 using System.Threading.Tasks;
15 
16 namespace Tgstation.Server.Host.Database
17 {
19 #pragma warning disable CA1506 // TODO: Decomplexify
20  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
21  {
24 
28  public DbSet<User> Users { get; set; }
29 
33  public DbSet<Instance> Instances { get; set; }
34 
38  public DbSet<CompileJob> CompileJobs { get; set; }
39 
43  public DbSet<RevisionInformation> RevisionInformations { get; set; }
44 
48  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
49 
53  public DbSet<ChatBot> ChatBots { get; set; }
54 
58  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
59 
63  public DbSet<RepositorySettings> RepositorySettings { get; set; }
64 
68  public DbSet<InstanceUser> InstanceUsers { get; set; }
69 
73  public DbSet<ChatChannel> ChatChannels { get; set; }
74 
78  public DbSet<Job> Jobs { get; set; }
79 
83  public DbSet<ReattachInformation> ReattachInformations { get; set; }
84 
88  public DbSet<DualReattachInformation> WatchdogReattachInformations { get; set; }
89 
93  public DbSet<TestMerge> TestMerges { get; set; }
94 
98  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
99 
103  protected ILogger Logger { get; }
104 
109 
112 
115 
118 
121 
124 
127 
130 
133 
136 
139 
142 
145 
148 
153 
158 
163 
168 
173 
178 
183 
188 
193 
198 
203 
208 
213 
218 
226  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
227  {
228  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
229  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
230  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
231 
232  usersCollection = new DatabaseCollection<User>(Users);
233  instancesCollection = new DatabaseCollection<Instance>(Instances);
234  instanceUsersCollection = new DatabaseCollection<InstanceUser>(InstanceUsers);
235  compileJobsCollection = new DatabaseCollection<CompileJob>(CompileJobs);
236  repositorySettingsCollection = new DatabaseCollection<RepositorySettings>(RepositorySettings);
237  dreamMakerSettingsCollection = new DatabaseCollection<DreamMakerSettings>(DreamMakerSettings);
238  dreamDaemonSettingsCollection = new DatabaseCollection<DreamDaemonSettings>(DreamDaemonSettings);
239  chatBotsCollection = new DatabaseCollection<ChatBot>(ChatBots);
240  chatChannelsCollection = new DatabaseCollection<ChatChannel>(ChatChannels);
241  revisionInformationsCollection = new DatabaseCollection<RevisionInformation>(RevisionInformations);
242  jobsCollection = new DatabaseCollection<Job>(Jobs);
243  reattachInformationsCollection = new DatabaseCollection<ReattachInformation>(ReattachInformations);
244  watchdogReattachInformationsCollection = new DatabaseCollection<DualReattachInformation>(WatchdogReattachInformations);
245  }
246 
248  protected override void OnModelCreating(ModelBuilder modelBuilder)
249  {
250  // Setup our more complex database relations
251  Logger.LogTrace("Building entity framework context...");
252  base.OnModelCreating(modelBuilder);
253 
254  var userModel = modelBuilder.Entity<User>();
255  userModel.HasIndex(x => x.CanonicalName).IsUnique();
256  userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
257  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
258 
259  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
260 
261  var revInfo = modelBuilder.Entity<RevisionInformation>();
262  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
263  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
264  revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
265 
266  // IMPORTANT: When an instance is deleted (detached) it cascades into the maze of revinfo/testmerge/ritm/compilejob/job/ri relations
267  // This maze starts at revInfo and jobs
268  // jobs takes care of deleting compile jobs and ris
269  // rev info takes care of the rest
270  // Break the link here so the db doesn't shit itself complaining about cascading deletes
271  // EF will handle making the right query to destroy everything
272  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.ClientNoAction);
273 
274  // Also break the link between ritm and testmerge so it doesn't cycle in a triangle with rev info
275  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
276 
277  var compileJob = modelBuilder.Entity<CompileJob>();
278  compileJob.HasIndex(x => x.DirectoryName);
279  compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
280 
281  var chatChannel = modelBuilder.Entity<ChatChannel>();
282  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
283  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
284  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
285 
286  modelBuilder.Entity<ChatBot>().HasIndex(x => new { x.InstanceId, x.Name }).IsUnique();
287 
288  var instanceModel = modelBuilder.Entity<Instance>();
289  instanceModel.HasIndex(x => x.Path).IsUnique();
290  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
291  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
292  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
293  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
294  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
295  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
296  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
297  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
298  }
299 
301  public async Task Initialize(CancellationToken cancellationToken)
302  {
303  ValidateDatabaseType();
304 
306  {
307  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
308  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
309  }
310 
311  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
312  var wasEmpty = !migrations.Any();
313 
314  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
315  {
316  Logger.LogInformation("Migrating database...");
317  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
318  }
319  else
320  Logger.LogDebug("No migrations to apply.");
321 
322  wasEmpty |= (await Users.AsQueryable().CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
323 
324  if (wasEmpty)
325  {
326  Logger.LogInformation("Seeding database...");
327  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
328  }
329  else
330  {
332  {
333  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
334  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
335  }
336 
337  await databaseSeeder.SanitizeDatabase(this, cancellationToken).ConfigureAwait(false);
338  }
339  }
340 
342  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
343 
345  public async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
346  {
347  if (version == null)
348  throw new ArgumentNullException(nameof(version));
349  if (version < new Version(4, 0))
350  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
351 
352  // Update this with new migrations as they are made
353  string targetMigration = null;
354  if (version < new Version(4, 1, 0))
355  throw new NotSupportedException("Cannot migrate below version 4.1.0!");
356  else if (version < new Version(4, 2, 0))
357  targetMigration = DatabaseType == DatabaseType.Sqlite ? nameof(SLRebuild) : nameof(MSFixCascadingDelete);
358 
359  if (targetMigration == null)
360  {
361  Logger.LogDebug("No down migration required.");
362  return;
363  }
364 
365  string migrationSubstitution;
366  switch (DatabaseType)
367  {
368  case DatabaseType.SqlServer:
369  // already setup
370  migrationSubstitution = null;
371  break;
372  case DatabaseType.MySql:
373  case DatabaseType.MariaDB:
374  migrationSubstitution = "MY{0}";
375  break;
376  case DatabaseType.Sqlite:
377  migrationSubstitution = "SL{0}";
378  break;
379  default:
380  throw new InvalidOperationException($"Invalid DatabaseType: {DatabaseType}");
381  }
382 
383  if (migrationSubstitution != null)
384  targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration.Substring(2));
385 
386  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
387  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
388  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
389 
390  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
391  try
392  {
393  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
394  }
395  catch (Exception e)
396  {
397  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
398  }
399  }
400 
404  protected abstract void ValidateDatabaseType();
405  }
406 }
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.EntityFrameworkCore.Infrastructure;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Logging;
6 using Microsoft.Extensions.Options;
7 using System;
8 using System.Globalization;
9 using System.Linq;
10 using System.Threading;
11 using System.Threading.Tasks;
15 
16 namespace Tgstation.Server.Host.Database
17 {
22 #pragma warning disable CA1506 // TODO: Decomplexify
23  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
24  {
27 
31  public DbSet<User> Users { get; set; }
32 
36  public DbSet<Instance> Instances { get; set; }
37 
41  public DbSet<CompileJob> CompileJobs { get; set; }
42 
46  public DbSet<RevisionInformation> RevisionInformations { get; set; }
47 
51  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
52 
56  public DbSet<ChatBot> ChatBots { get; set; }
57 
61  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
62 
66  public DbSet<RepositorySettings> RepositorySettings { get; set; }
67 
71  public DbSet<InstanceUser> InstanceUsers { get; set; }
72 
76  public DbSet<ChatChannel> ChatChannels { get; set; }
77 
81  public DbSet<Job> Jobs { get; set; }
82 
86  public DbSet<ReattachInformation> ReattachInformations { get; set; }
87 
91  public DbSet<DualReattachInformation> WatchdogReattachInformations { get; set; }
92 
96  public DbSet<TestMerge> TestMerges { get; set; }
97 
101  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
102 
106  protected ILogger Logger { get; }
107 
112 
115 
118 
121 
124 
127 
130 
133 
136 
139 
142 
145 
148 
151 
156 
161 
166 
171 
176 
181 
186 
191 
196 
201 
206 
211 
216 
221 
229  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
230  {
231  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
232  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
233  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
234 
235  usersCollection = new DatabaseCollection<User>(Users);
236  instancesCollection = new DatabaseCollection<Instance>(Instances);
237  instanceUsersCollection = new DatabaseCollection<InstanceUser>(InstanceUsers);
238  compileJobsCollection = new DatabaseCollection<CompileJob>(CompileJobs);
239  repositorySettingsCollection = new DatabaseCollection<RepositorySettings>(RepositorySettings);
240  dreamMakerSettingsCollection = new DatabaseCollection<DreamMakerSettings>(DreamMakerSettings);
241  dreamDaemonSettingsCollection = new DatabaseCollection<DreamDaemonSettings>(DreamDaemonSettings);
242  chatBotsCollection = new DatabaseCollection<ChatBot>(ChatBots);
243  chatChannelsCollection = new DatabaseCollection<ChatChannel>(ChatChannels);
244  revisionInformationsCollection = new DatabaseCollection<RevisionInformation>(RevisionInformations);
245  jobsCollection = new DatabaseCollection<Job>(Jobs);
246  reattachInformationsCollection = new DatabaseCollection<ReattachInformation>(ReattachInformations);
247  watchdogReattachInformationsCollection = new DatabaseCollection<DualReattachInformation>(WatchdogReattachInformations);
248  }
249 
251  protected override void OnModelCreating(ModelBuilder modelBuilder)
252  {
253  // Setup our more complex database relations
254  Logger.LogTrace("Building entity framework context...");
255  base.OnModelCreating(modelBuilder);
256 
257  var userModel = modelBuilder.Entity<User>();
258  userModel.HasIndex(x => x.CanonicalName).IsUnique();
259  userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
260  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
261 
262  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
263 
264  var revInfo = modelBuilder.Entity<RevisionInformation>();
265  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
266  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
267  revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
268 
269  // IMPORTANT: When an instance is deleted (detached) it cascades into the maze of revinfo/testmerge/ritm/compilejob/job/ri relations
270  // This maze starts at revInfo and jobs
271  // jobs takes care of deleting compile jobs and ris
272  // rev info takes care of the rest
273  // Break the link here so the db doesn't shit itself complaining about cascading deletes
274  // EF will handle making the right query to destroy everything
275  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.ClientNoAction);
276 
277  // Also break the link between ritm and testmerge so it doesn't cycle in a triangle with rev info
278  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
279 
280  var compileJob = modelBuilder.Entity<CompileJob>();
281  compileJob.HasIndex(x => x.DirectoryName);
282  compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
283 
284  var chatChannel = modelBuilder.Entity<ChatChannel>();
285  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
286  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
287  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
288 
289  modelBuilder.Entity<ChatBot>().HasIndex(x => new { x.InstanceId, x.Name }).IsUnique();
290 
291  var instanceModel = modelBuilder.Entity<Instance>();
292  instanceModel.HasIndex(x => x.Path).IsUnique();
293  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
294  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
295  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
296  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
297  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
298  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
299  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
300  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
301  }
302 
304  public async Task Initialize(CancellationToken cancellationToken)
305  {
306  ValidateDatabaseType();
307 
309  {
310  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
311  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
312  }
313 
314  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
315  var wasEmpty = !migrations.Any();
316 
317  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
318  {
319  Logger.LogInformation("Migrating database...");
320  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
321  }
322  else
323  Logger.LogDebug("No migrations to apply.");
324 
325  wasEmpty |= (await Users.AsQueryable().CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
326 
327  if (wasEmpty)
328  {
329  Logger.LogInformation("Seeding database...");
330  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
331  }
332  else
333  {
335  {
336  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
337  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
338  }
339 
340  await databaseSeeder.SanitizeDatabase(this, cancellationToken).ConfigureAwait(false);
341  }
342  }
343 
345  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
346 
348  public async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
349  {
350  if (version == null)
351  throw new ArgumentNullException(nameof(version));
352  if (version < new Version(4, 0))
353  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
354 
355  // Update this with new migrations as they are made
356  string targetMigration = null;
357  if (version < new Version(4, 1, 0))
358  throw new NotSupportedException("Cannot migrate below version 4.1.0!");
359  else if (version < new Version(4, 2, 0))
360  targetMigration = DatabaseType == DatabaseType.Sqlite ? nameof(SLRebuild) : nameof(MSFixCascadingDelete);
361 
362  if (targetMigration == null)
363  {
364  Logger.LogDebug("No down migration required.");
365  return;
366  }
367 
368  string migrationSubstitution;
369  switch (DatabaseType)
370  {
371  case DatabaseType.SqlServer:
372  // already setup
373  migrationSubstitution = null;
374  break;
375  case DatabaseType.MySql:
376  case DatabaseType.MariaDB:
377  migrationSubstitution = "MY{0}";
378  break;
379  case DatabaseType.Sqlite:
380  migrationSubstitution = "SL{0}";
381  break;
382  default:
383  throw new InvalidOperationException($"Invalid DatabaseType: {DatabaseType}");
384  }
385 
386  if (migrationSubstitution != null)
387  targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration.Substring(2));
388 
389  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
390  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
391  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
392 
393  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
394  try
395  {
396  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
397  }
398  catch (Exception e)
399  {
400  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
401  }
402  }
403 
407  protected abstract void ValidateDatabaseType();
408  }
409 }
IDatabaseCollection< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
IDatabaseCollection< InstanceUser > InstanceUsers
The InstanceUsers in the IDatabaseContext
-
readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
+
readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
IDatabaseCollection< ChatChannel > ChatChannels
The ChatChannel in the IDatabaseContext
-
readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
+
readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
-
readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
+
readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
-
readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
+
readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
For initially seeding a database
-
readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
+
readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
Fix cascading data deletes for Models.Instances on MSSQL.
IDatabaseCollection< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
-
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
-
readonly IDatabaseCollection< InstanceUser > instanceUsersCollection
Backing field for IDatabaseContext.InstanceUsers.
+
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
+
readonly IDatabaseCollection< InstanceUser > instanceUsersCollection
Backing field for IDatabaseContext.InstanceUsers.
-
readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
- +
readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
+
Backend abstract implementation of IDatabaseContext
IDatabaseCollection< Instance > Instances
The Instances in the IDatabaseContext
-
readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
+
readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
IDatabaseCollection< ChatBot > ChatBots
The ChatBots in the IDatabaseContext
DatabaseType DatabaseType
The Configuration.DatabaseType to create
- +
IDatabaseCollection< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the IDatabaseContext
-
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
+
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
bool ResetAdminPassword
If the admin user should be enabled and have it&#39;s password reset
IDatabaseCollection< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the IDatabaseContext
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
-
async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version ...
+
async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version ...
IDatabaseCollection< DualReattachInformation > WatchdogReattachInformations
The DbSet<TEntity> for DualReattachInformations
Configuration options for the Database.DatabaseContext<TParentContext>
-
readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
+
readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
bool DropDatabase
If the database should be deleted on application startup. Should not be used in production! ...
-
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
IDatabaseCollection< DreamDaemonSettings > DreamDaemonSettings
The Models.DreamDaemonSettings in the IDatabaseContext
IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations
IDatabaseCollection< Job > Jobs
The Jobs in the IDatabaseContext
-
readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
-
readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
+
readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
+
readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
-
override void OnModelCreating(ModelBuilder modelBuilder)
+
override void OnModelCreating(ModelBuilder modelBuilder)
IDatabaseCollection< User > Users
The Users in the IDatabaseContext
@@ -155,9 +155,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
+
readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
-
readonly IDatabaseCollection< DualReattachInformation > watchdogReattachInformationsCollection
Backing field for IDatabaseContext.WatchdogReattachInformations.
+
readonly IDatabaseCollection< DualReattachInformation > watchdogReattachInformationsCollection
Backing field for IDatabaseContext.WatchdogReattachInformations.
diff --git a/_database_context_extensions_8cs_source.html b/_database_context_extensions_8cs_source.html index 38d9e4b0d4..2856373a7b 100644 --- a/_database_context_extensions_8cs_source.html +++ b/_database_context_extensions_8cs_source.html @@ -25,7 +25,7 @@ @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
IDatabaseCollection< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
- + diff --git a/_database_context_factory_8cs.html b/_database_context_factory_8cs.html index 0e48d61ccc..5e7838d4f3 100644 --- a/_database_context_factory_8cs.html +++ b/_database_context_factory_8cs.html @@ -25,7 +25,7 @@
diff --git a/_database_context_factory_8cs_source.html b/_database_context_factory_8cs_source.html index ca5536334b..a56d6db271 100644 --- a/_database_context_factory_8cs_source.html +++ b/_database_context_factory_8cs_source.html @@ -25,7 +25,7 @@ @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Go to the documentation of this file.
1 using Microsoft.Extensions.DependencyInjection;
2 using System;
3 using System.Threading.Tasks;
4 
5 namespace Tgstation.Server.Host.Database
6 {
9  {
13  readonly IServiceScopeFactory scopeFactory;
14 
19  public DatabaseContextFactory(IServiceScopeFactory scopeFactory)
20  {
21  this.scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory));
22 
23  using var scope = scopeFactory.CreateScope();
24  scope.ServiceProvider.GetRequiredService<IDatabaseContext>();
25  }
26 
28  public async Task UseContext(Func<IDatabaseContext, Task> operation)
29  {
30  if (operation == null)
31  throw new ArgumentNullException(nameof(operation));
32 
33  using var scope = scopeFactory.CreateScope();
34  await operation(scope.ServiceProvider.GetRequiredService<IDatabaseContext>()).ConfigureAwait(false);
35  }
36  }
37 }
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
- +
async Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
readonly IServiceScopeFactory scopeFactory
The IServiceScopeFactory for the DatabaseContextFactory
diff --git a/_database_seeder_8cs.html b/_database_seeder_8cs.html index 1e56c05e0e..a9b10a2517 100644 --- a/_database_seeder_8cs.html +++ b/_database_seeder_8cs.html @@ -25,7 +25,7 @@
diff --git a/_database_seeder_8cs_source.html b/_database_seeder_8cs_source.html index cedf43192b..4cd71ffa18 100644 --- a/_database_seeder_8cs_source.html +++ b/_database_seeder_8cs_source.html @@ -25,7 +25,7 @@ @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Contains various cryptographic functions
IDatabaseCollection< Instance > Instances
The Instances in the IDatabaseContext
- +
async Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it&#39;s default and enables the account ...
InstanceManagerRights
Rights for managing Models.Instances
static string CanonicalizeName(string name)
Change a Api.Models.Internal.User.Name into a CanonicalName.
diff --git a/_database_type_8cs.html b/_database_type_8cs.html index 8125b19275..1cad15a6b3 100644 --- a/_database_type_8cs.html +++ b/_database_type_8cs.html @@ -25,7 +25,7 @@
diff --git a/_database_type_8cs_source.html b/_database_type_8cs_source.html index 264db0ddc9..b48ed74ef1 100644 --- a/_database_type_8cs_source.html +++ b/_database_type_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dead_session_controller_8cs.html b/_dead_session_controller_8cs.html index 9e65c7d288..32f66571b9 100644 --- a/_dead_session_controller_8cs.html +++ b/_dead_session_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dead_session_controller_8cs_source.html b/_dead_session_controller_8cs_source.html index f7049b3e5c..54c8a20907 100644 --- a/_dead_session_controller_8cs_source.html +++ b/_dead_session_controller_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_default_i_o_manager_8cs.html b/_default_i_o_manager_8cs.html index 737caaf413..4c9cdd01ac 100644 --- a/_default_i_o_manager_8cs.html +++ b/_default_i_o_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_default_i_o_manager_8cs_source.html b/_default_i_o_manager_8cs_source.html index 4d0beed2dd..4fe54ac930 100644 --- a/_default_i_o_manager_8cs_source.html +++ b/_default_i_o_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_design_time_db_context_factory_helpers_8cs.html b/_design_time_db_context_factory_helpers_8cs.html index a989d21214..874dc58ac9 100644 --- a/_design_time_db_context_factory_helpers_8cs.html +++ b/_design_time_db_context_factory_helpers_8cs.html @@ -25,7 +25,7 @@ diff --git a/_design_time_db_context_factory_helpers_8cs_source.html b/_design_time_db_context_factory_helpers_8cs_source.html index 8483185acb..a8e2e5be67 100644 --- a/_design_time_db_context_factory_helpers_8cs_source.html +++ b/_design_time_db_context_factory_helpers_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_discord_connection_string_builder_8cs.html b/_discord_connection_string_builder_8cs.html index 63c34ef0bf..2afd63f014 100644 --- a/_discord_connection_string_builder_8cs.html +++ b/_discord_connection_string_builder_8cs.html @@ -25,7 +25,7 @@ diff --git a/_discord_connection_string_builder_8cs_source.html b/_discord_connection_string_builder_8cs_source.html index 55132813f4..776fc34942 100644 --- a/_discord_connection_string_builder_8cs_source.html +++ b/_discord_connection_string_builder_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_discord_provider_8cs.html b/_discord_provider_8cs.html index 52d89edcd9..5949a5b31c 100644 --- a/_discord_provider_8cs.html +++ b/_discord_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_discord_provider_8cs_source.html b/_discord_provider_8cs_source.html index de67fd18be..f3dbde15c5 100644 --- a/_discord_provider_8cs_source.html +++ b/_discord_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dmb_factory_8cs.html b/_dmb_factory_8cs.html index c667369d4a..4349045e07 100644 --- a/_dmb_factory_8cs.html +++ b/_dmb_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dmb_factory_8cs_source.html b/_dmb_factory_8cs_source.html index c22fb74565..2f92117186 100644 --- a/_dmb_factory_8cs_source.html +++ b/_dmb_factory_8cs_source.html @@ -25,7 +25,7 @@ @@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DmbFactory.cs
-Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
10 using Tgstation.Server.Host.IO;
12 
13 namespace Tgstation.Server.Host.Components.Deployment
14 {
19  {
21  public Task OnNewerDmb
22  {
23  get
24  {
25  lock (jobLockCounts)
26  return newerDmbTcs.Task;
27  }
28  }
29 
31  public bool DmbAvailable => nextDmbProvider != null;
32 
37 
42 
46  readonly ILogger<DmbFactory> logger;
47 
51  readonly Api.Models.Instance instance;
52 
56  readonly CancellationTokenSource cleanupCts;
57 
61  readonly IDictionary<long, int> jobLockCounts;
62 
67 
71  TaskCompletionSource<object> newerDmbTcs;
72 
77 
85  public DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger<DmbFactory> logger, Api.Models.Instance instance)
86  {
87  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
88  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
89  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
90  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
91 
92  cleanupTask = Task.CompletedTask;
93  newerDmbTcs = new TaskCompletionSource<object>();
94  cleanupCts = new CancellationTokenSource();
95  jobLockCounts = new Dictionary<long, int>();
96  }
97 
99  public void Dispose() => cleanupCts.Dispose(); // we don't dispose nextDmbProvider here, since it might be the only thing we have
100 
106  {
107  async Task HandleCleanup()
108  {
109  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
110  Task otherTask;
111 
112  // lock (this) //already locked below
113  otherTask = cleanupTask;
114  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
115  }
116 
117  lock (jobLockCounts)
118  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
119  {
120  jobLockCounts.Remove(job.Id);
121  logger.LogDebug("Cleaning lock-free compile job {0} => {1}", job.Id, job.DirectoryName);
122  cleanupTask = HandleCleanup();
123  }
124  else
125  {
126  var decremented = --jobLockCounts[job.Id];
127  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
128  }
129  }
130 
132  public async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
133  {
134  if (job == null)
135  throw new ArgumentNullException(nameof(job));
136 
137  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
138  if (newProvider == null)
139  return;
140  lock (jobLockCounts)
141  {
142  nextDmbProvider?.Dispose();
143  nextDmbProvider = newProvider;
144  newerDmbTcs.SetResult(nextDmbProvider);
145  newerDmbTcs = new TaskCompletionSource<object>();
146  }
147  }
148 
150  public IDmbProvider LockNextDmb(int lockCount)
151  {
152  if (!DmbAvailable)
153  throw new InvalidOperationException("No .dmb available!");
154  if (lockCount < 0)
155  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
156  lock (jobLockCounts)
157  {
158  var jobId = nextDmbProvider.CompileJob.Id;
159  var incremented = jobLockCounts[jobId] += lockCount;
160  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
161  return nextDmbProvider;
162  }
163  }
164 
166  public async Task StartAsync(CancellationToken cancellationToken)
167  {
168  CompileJob cj = null;
169  await databaseContextFactory.UseContext(async (db) =>
170  {
171  cj = await db
172  .MostRecentCompletedCompileJobOrDefault(instance, cancellationToken)
173  .ConfigureAwait(false);
174  })
175  .ConfigureAwait(false);
176 
177  if (cj == default(CompileJob))
178  return;
179  await LoadCompileJob(cj, cancellationToken).ConfigureAwait(false);
180 
181  // we dont do CleanUnusedCompileJobs here because the watchdog may have plans for them yet
182  }
183 
185  public async Task StopAsync(CancellationToken cancellationToken)
186  {
187  using (cancellationToken.Register(() => cleanupCts.Cancel()))
188  await cleanupTask.ConfigureAwait(false);
189  }
190 
192  #pragma warning disable CA1506 // TODO: Decomplexify
193  public async Task<IDmbProvider> FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
194  {
195  if (compileJob == null)
196  throw new ArgumentNullException(nameof(compileJob));
197 
198  // ensure we have the entire compile job tree
199  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
200  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
201  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
202  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
203  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); // can't wait to see that query
204 
205  if (!compileJob.Job.StoppedAt.HasValue)
206  {
207  // This happens if we're told to load the compile job that is currently finished up
208  // It can constitute an API violation if it's returned by the DreamDaemonController so just set it here
209  // Bit of a hack, but it should work out to be the same value
210  logger.LogTrace("Setting missing StoppedAt for CompileJob job...");
211  compileJob.Job.StoppedAt = DateTimeOffset.Now;
212  }
213 
214  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
215  var providerSubmitted = false;
216  var newProvider = new DmbProvider(compileJob, ioManager, () =>
217  {
218  if (providerSubmitted)
219  CleanJob(compileJob);
220  });
221 
222  try
223  {
224  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
225  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
226 
227  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
228  {
229  logger.LogWarning("Error loading compile job, .dmb missing!");
230  return null; // omae wa mou shinderu
231  }
232 
233  lock (jobLockCounts)
234  {
235  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
236  {
237  value = 1;
238  jobLockCounts.Add(compileJob.Id, 1);
239  }
240  else
241  jobLockCounts[compileJob.Id] = ++value;
242 
243  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
244 
245  providerSubmitted = true;
246  return newProvider;
247  }
248  }
249  finally
250  {
251  if (!providerSubmitted)
252  newProvider.Dispose();
253  }
254  }
255  #pragma warning restore CA1506
256 
258  #pragma warning disable CA1506 // TODO: Decomplexify
259  public async Task CleanUnusedCompileJobs(CancellationToken cancellationToken)
260  {
261  List<long> jobIdsToSkip;
262 
263  // don't clean locked directories
264  lock (jobLockCounts)
265  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
266 
267  List<string> jobUidsToNotErase = null;
268 
269  // find the uids of locked directories
270  await databaseContextFactory.UseContext(async db =>
271  {
272  jobUidsToNotErase = (await db.CompileJobs.Where(
273  x => x.Job.Instance.Id == instance.Id && jobIdsToSkip.Contains(x.Id))
274  .Select(x => x.DirectoryName.Value)
275  .ToListAsync(cancellationToken)
276  .ConfigureAwait(false))
277  .Select(x => x.ToString())
278  .ToList();
279  }).ConfigureAwait(false);
280 
281  jobUidsToNotErase.Add(WindowsSwappableDmbProvider.LiveGameDirectory);
282 
283  logger.LogTrace("We will not clean the following directories: {0}", String.Join(", ", jobUidsToNotErase));
284 
285  // cleanup
286  var gameDirectory = ioManager.ResolvePath();
287  await ioManager.CreateDirectory(gameDirectory, cancellationToken).ConfigureAwait(false);
288  var directories = await ioManager.GetDirectories(gameDirectory, cancellationToken).ConfigureAwait(false);
289  int deleting = 0;
290  var tasks = directories.Select(async x =>
291  {
292  var nameOnly = ioManager.GetFileName(x);
293  if (jobUidsToNotErase.Contains(nameOnly))
294  return;
295  logger.LogDebug("Cleaning unused game folder: {0}...", nameOnly);
296  try
297  {
298  ++deleting;
299  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
300  }
301  catch (OperationCanceledException)
302  {
303  throw;
304  }
305  catch (Exception e)
306  {
307  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
308  }
309  }).ToList();
310  if (deleting > 0)
311  await Task.WhenAll(tasks).ConfigureAwait(false);
312  }
313  #pragma warning restore CA1506
314 
317  {
318  if (!DmbAvailable)
319  return null;
320  return LockNextDmb(0)?.CompileJob;
321  }
322  }
323 }
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
10 using Tgstation.Server.Host.IO;
12 
13 namespace Tgstation.Server.Host.Components.Deployment
14 {
19  {
21  public Task OnNewerDmb
22  {
23  get
24  {
25  lock (jobLockCounts)
26  return newerDmbTcs.Task;
27  }
28  }
29 
31  public bool DmbAvailable => nextDmbProvider != null;
32 
37 
42 
46  readonly ILogger<DmbFactory> logger;
47 
51  readonly Api.Models.Instance instance;
52 
56  readonly CancellationTokenSource cleanupCts;
57 
61  readonly IDictionary<long, int> jobLockCounts;
62 
67 
71  TaskCompletionSource<object> newerDmbTcs;
72 
77 
85  public DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger<DmbFactory> logger, Api.Models.Instance instance)
86  {
87  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
88  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
89  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
90  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
91 
92  cleanupTask = Task.CompletedTask;
93  newerDmbTcs = new TaskCompletionSource<object>();
94  cleanupCts = new CancellationTokenSource();
95  jobLockCounts = new Dictionary<long, int>();
96  }
97 
99  public void Dispose() => cleanupCts.Dispose(); // we don't dispose nextDmbProvider here, since it might be the only thing we have
100 
106  {
107  async Task HandleCleanup()
108  {
109  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
110  Task otherTask;
111 
112  // lock (this) //already locked below
113  otherTask = cleanupTask;
114  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
115  }
116 
117  lock (jobLockCounts)
118  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
119  {
120  jobLockCounts.Remove(job.Id);
121  logger.LogDebug("Cleaning lock-free compile job {0} => {1}", job.Id, job.DirectoryName);
122  cleanupTask = HandleCleanup();
123  }
124  else
125  {
126  var decremented = --jobLockCounts[job.Id];
127  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
128  }
129  }
130 
132  public async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
133  {
134  if (job == null)
135  throw new ArgumentNullException(nameof(job));
136 
137  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
138  if (newProvider == null)
139  return;
140  lock (jobLockCounts)
141  {
142  nextDmbProvider?.Dispose();
143  nextDmbProvider = newProvider;
144  newerDmbTcs.SetResult(nextDmbProvider);
145  newerDmbTcs = new TaskCompletionSource<object>();
146  }
147  }
148 
150  public IDmbProvider LockNextDmb(int lockCount)
151  {
152  if (!DmbAvailable)
153  throw new InvalidOperationException("No .dmb available!");
154  if (lockCount < 0)
155  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
156  lock (jobLockCounts)
157  {
158  var jobId = nextDmbProvider.CompileJob.Id;
159  var incremented = jobLockCounts[jobId] += lockCount;
160  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
161  return nextDmbProvider;
162  }
163  }
164 
166  public async Task StartAsync(CancellationToken cancellationToken)
167  {
168  CompileJob cj = null;
169  await databaseContextFactory.UseContext(async (db) =>
170  {
171  cj = await db
172  .MostRecentCompletedCompileJobOrDefault(instance, cancellationToken)
173  .ConfigureAwait(false);
174  })
175  .ConfigureAwait(false);
176 
177  if (cj == default(CompileJob))
178  return;
179  await LoadCompileJob(cj, cancellationToken).ConfigureAwait(false);
180 
181  // we dont do CleanUnusedCompileJobs here because the watchdog may have plans for them yet
182  }
183 
185  public async Task StopAsync(CancellationToken cancellationToken)
186  {
187  using (cancellationToken.Register(() => cleanupCts.Cancel()))
188  await cleanupTask.ConfigureAwait(false);
189  }
190 
192  #pragma warning disable CA1506 // TODO: Decomplexify
193  public async Task<IDmbProvider> FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
194  {
195  if (compileJob == null)
196  throw new ArgumentNullException(nameof(compileJob));
197 
198  // ensure we have the entire compile job tree
199  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
200  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
201  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
202  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
203  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
204  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); // can't wait to see that query
205 
206  if (!compileJob.Job.StoppedAt.HasValue)
207  {
208  // This happens if we're told to load the compile job that is currently finished up
209  // It can constitute an API violation if it's returned by the DreamDaemonController so just set it here
210  // Bit of a hack, but it should work out to be the same value
211  logger.LogTrace("Setting missing StoppedAt for CompileJob job...");
212  compileJob.Job.StoppedAt = DateTimeOffset.Now;
213  }
214 
215  var providerSubmitted = false;
216  var newProvider = new DmbProvider(compileJob, ioManager, () =>
217  {
218  if (providerSubmitted)
219  CleanJob(compileJob);
220  });
221 
222  try
223  {
224  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
225  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
226 
227  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
228  {
229  logger.LogWarning("Error loading compile job, .dmb missing!");
230  return null; // omae wa mou shinderu
231  }
232 
233  lock (jobLockCounts)
234  {
235  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
236  {
237  value = 1;
238  jobLockCounts.Add(compileJob.Id, 1);
239  }
240  else
241  jobLockCounts[compileJob.Id] = ++value;
242 
243  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
244 
245  providerSubmitted = true;
246  return newProvider;
247  }
248  }
249  finally
250  {
251  if (!providerSubmitted)
252  newProvider.Dispose();
253  }
254  }
255  #pragma warning restore CA1506
256 
258  #pragma warning disable CA1506 // TODO: Decomplexify
259  public async Task CleanUnusedCompileJobs(CancellationToken cancellationToken)
260  {
261  List<long> jobIdsToSkip;
262 
263  // don't clean locked directories
264  lock (jobLockCounts)
265  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
266 
267  List<string> jobUidsToNotErase = null;
268 
269  // find the uids of locked directories
270  await databaseContextFactory.UseContext(async db =>
271  {
272  jobUidsToNotErase = (await db.CompileJobs.Where(
273  x => x.Job.Instance.Id == instance.Id && jobIdsToSkip.Contains(x.Id))
274  .Select(x => x.DirectoryName.Value)
275  .ToListAsync(cancellationToken)
276  .ConfigureAwait(false))
277  .Select(x => x.ToString())
278  .ToList();
279  }).ConfigureAwait(false);
280 
281  jobUidsToNotErase.Add(WindowsSwappableDmbProvider.LiveGameDirectory);
282 
283  logger.LogTrace("We will not clean the following directories: {0}", String.Join(", ", jobUidsToNotErase));
284 
285  // cleanup
286  var gameDirectory = ioManager.ResolvePath();
287  await ioManager.CreateDirectory(gameDirectory, cancellationToken).ConfigureAwait(false);
288  var directories = await ioManager.GetDirectories(gameDirectory, cancellationToken).ConfigureAwait(false);
289  int deleting = 0;
290  var tasks = directories.Select(async x =>
291  {
292  var nameOnly = ioManager.GetFileName(x);
293  if (jobUidsToNotErase.Contains(nameOnly))
294  return;
295  logger.LogDebug("Cleaning unused game folder: {0}...", nameOnly);
296  try
297  {
298  ++deleting;
299  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
300  }
301  catch (OperationCanceledException)
302  {
303  throw;
304  }
305  catch (Exception e)
306  {
307  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
308  }
309  }).ToList();
310  if (deleting > 0)
311  await Task.WhenAll(tasks).ConfigureAwait(false);
312  }
313  #pragma warning restore CA1506
314 
317  {
318  if (!DmbAvailable)
319  return null;
320  return LockNextDmb(0)?.CompileJob;
321  }
322  }
323 }
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
async Task StartAsync(CancellationToken cancellationToken)
Definition: DmbFactory.cs:166
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:76
diff --git a/_dmb_provider_8cs.html b/_dmb_provider_8cs.html index 0ece1b37a0..cab97cba05 100644 --- a/_dmb_provider_8cs.html +++ b/_dmb_provider_8cs.html @@ -25,7 +25,7 @@
diff --git a/_dmb_provider_8cs_source.html b/_dmb_provider_8cs_source.html index 5781418d3e..272639721e 100644 --- a/_dmb_provider_8cs_source.html +++ b/_dmb_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_8cs.html b/_dream_daemon_8cs.html index a53713c53e..2459c2ca1a 100644 --- a/_dream_daemon_8cs.html +++ b/_dream_daemon_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_8cs_source.html b/_dream_daemon_8cs_source.html index 6a4b72089b..88deecb0dc 100644 --- a/_dream_daemon_8cs_source.html +++ b/_dream_daemon_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_client_8cs.html b/_dream_daemon_client_8cs.html index 078a87c0c9..ea40415e2d 100644 --- a/_dream_daemon_client_8cs.html +++ b/_dream_daemon_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_client_8cs_source.html b/_dream_daemon_client_8cs_source.html index 1ceb72b752..27a82e7bfc 100644 --- a/_dream_daemon_client_8cs_source.html +++ b/_dream_daemon_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_controller_8cs.html b/_dream_daemon_controller_8cs.html index 5378681143..0937862e22 100644 --- a/_dream_daemon_controller_8cs.html +++ b/_dream_daemon_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_controller_8cs_source.html b/_dream_daemon_controller_8cs_source.html index ced26705d7..13e70bb349 100644 --- a/_dream_daemon_controller_8cs_source.html +++ b/_dream_daemon_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -110,17 +110,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool AutoStart
If DreamDaemon starts when it&#39;s Instance starts
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
- +
Backend abstract implementation of IDatabaseContext
async Task< IActionResult > ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
Implementation of Read(CancellationToken)
async Task< IActionResult > Restart(CancellationToken cancellationToken)
Creates a Api.Models.Job to restart the Watchdog. It will start if it wasn&#39;t already running...
Routes to a server actions
Definition: Routes.cs:9
DreamDaemonRights
Rights for Models.DreamDaemon
- +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
DreamDaemonRights DreamDaemonRights
The Rights.DreamDaemonRights of the InstanceUser
Definition: InstanceUser.cs:33
-
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
+
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
async Task< IActionResult > Create(CancellationToken cancellationToken)
Launches the watchdog.
DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamDaemonController > logger)
Construct a DreamDaemonController
diff --git a/_dream_daemon_launch_parameters_8cs.html b/_dream_daemon_launch_parameters_8cs.html index 4e38289c9c..01092d6e42 100644 --- a/_dream_daemon_launch_parameters_8cs.html +++ b/_dream_daemon_launch_parameters_8cs.html @@ -25,7 +25,7 @@
diff --git a/_dream_daemon_launch_parameters_8cs_source.html b/_dream_daemon_launch_parameters_8cs_source.html index 48c6f40c62..c631ce5a2d 100644 --- a/_dream_daemon_launch_parameters_8cs_source.html +++ b/_dream_daemon_launch_parameters_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_rights_8cs.html b/_dream_daemon_rights_8cs.html index ed869b668c..4da7147ce5 100644 --- a/_dream_daemon_rights_8cs.html +++ b/_dream_daemon_rights_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_rights_8cs_source.html b/_dream_daemon_rights_8cs_source.html index c4a25423d2..71ccc153ca 100644 --- a/_dream_daemon_rights_8cs_source.html +++ b/_dream_daemon_rights_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_security_8cs.html b/_dream_daemon_security_8cs.html index cc4e22307f..c08b917e86 100644 --- a/_dream_daemon_security_8cs.html +++ b/_dream_daemon_security_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_daemon_security_8cs_source.html b/_dream_daemon_security_8cs_source.html index 7440565cfe..23395874f6 100644 --- a/_dream_daemon_security_8cs_source.html +++ b/_dream_daemon_security_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_client_8cs.html b/_dream_maker_client_8cs.html index 9ee9db3d3c..30640b139c 100644 --- a/_dream_maker_client_8cs.html +++ b/_dream_maker_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_client_8cs_source.html b/_dream_maker_client_8cs_source.html index 717f22916a..e93d510a14 100644 --- a/_dream_maker_client_8cs_source.html +++ b/_dream_maker_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_controller_8cs.html b/_dream_maker_controller_8cs.html index 0d8497ea5e..f37810a97c 100644 --- a/_dream_maker_controller_8cs.html +++ b/_dream_maker_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_controller_8cs_source.html b/_dream_maker_controller_8cs_source.html index 4251852541..4903f9ebc9 100644 --- a/_dream_maker_controller_8cs_source.html +++ b/_dream_maker_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -112,11 +112,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
async Task< IActionResult > Read(CancellationToken cancellationToken)
Read current DreamMaker status.
- +
Backend abstract implementation of IDatabaseContext
Routes to a server actions
Definition: Routes.cs:9
-
DbSet< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the DatabaseContext<TParentContext>.
- +
DbSet< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the DatabaseContext<TParentContext>.
+
async Task< IActionResult > Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
Update deployment settings.
IDreamMaker DreamMaker
The IDreamMaker for the IInstance.
Definition: IInstance.cs:31
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
@@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
const string List
The postfix for list operations
Definition: Routes.cs:84
-
DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext<TParentContext>.
+
DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext<TParentContext>.
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
diff --git a/_dream_maker_rights_8cs.html b/_dream_maker_rights_8cs.html index fbe283eca0..407cbf3cec 100644 --- a/_dream_maker_rights_8cs.html +++ b/_dream_maker_rights_8cs.html @@ -25,7 +25,7 @@
diff --git a/_dream_maker_rights_8cs_source.html b/_dream_maker_rights_8cs_source.html index 0b69e0f2ee..03ccf9979c 100644 --- a/_dream_maker_rights_8cs_source.html +++ b/_dream_maker_rights_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_settings_8cs.html b/_dream_maker_settings_8cs.html index c6d79dc2b2..8f7ed18aee 100644 --- a/_dream_maker_settings_8cs.html +++ b/_dream_maker_settings_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dream_maker_settings_8cs_source.html b/_dream_maker_settings_8cs_source.html index 66d6912611..04f12a6f12 100644 --- a/_dream_maker_settings_8cs_source.html +++ b/_dream_maker_settings_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_dual_reattach_information_base_8cs.html b/_dual_reattach_information_base_8cs.html index 2bfe8a3339..a60fbb41f8 100644 --- a/_dual_reattach_information_base_8cs.html +++ b/_dual_reattach_information_base_8cs.html @@ -25,7 +25,7 @@ diff --git a/_dual_reattach_information_base_8cs_source.html b/_dual_reattach_information_base_8cs_source.html index cbd8fe5895..3d96e983fd 100644 --- a/_dual_reattach_information_base_8cs_source.html +++ b/_dual_reattach_information_base_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_entity_id_8cs.html b/_entity_id_8cs.html index fbd6195bd8..8cd1bba647 100644 --- a/_entity_id_8cs.html +++ b/_entity_id_8cs.html @@ -25,7 +25,7 @@ diff --git a/_entity_id_8cs_source.html b/_entity_id_8cs_source.html index 95b84ebd0d..1602cfaf1e 100644 --- a/_entity_id_8cs_source.html +++ b/_entity_id_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_error_code_8cs.html b/_error_code_8cs.html index 7afe6600bd..0117995695 100644 --- a/_error_code_8cs.html +++ b/_error_code_8cs.html @@ -25,7 +25,7 @@ @@ -205,7 +205,8 @@ Enumerations
  Tgstation.Server.Api.Models.ErrorCode.DreamDaemonDoubleSoft, Tgstation.Server.Api.Models.ErrorCode.DeploymentPagerRunning, -Tgstation.Server.Api.Models.ErrorCode.DreamDaemonPortInUse +Tgstation.Server.Api.Models.ErrorCode.DreamDaemonPortInUse, +Tgstation.Server.Api.Models.ErrorCode.PostDeployFailure
}
diff --git a/_error_code_8cs_source.html b/_error_code_8cs_source.html index 3ee011d2ae..cf8248f33a 100644 --- a/_error_code_8cs_source.html +++ b/_error_code_8cs_source.html @@ -25,7 +25,7 @@ @@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ErrorCode.cs
-Go to the documentation of this file.
1 using System;
2 using System.ComponentModel;
3 
4 namespace Tgstation.Server.Api.Models
5 {
10  public enum ErrorCode : uint
11  {
15  [Description("An internal server error occurred!")]
17 
21  [Description("API Mismatch but no current API version provided!")]
23 
27  [Description("The request body was malformed!")]
29 
33  [Description("An IO error occurred during the operation!")]
34  IOError,
35 
39  [Description("A header validation error occurred!")]
40  BadHeaders,
41 
45  [Description("Cannot generate a bearer token using a bearer token!")]
47 
51  [Description("The operation could not be performed as it would violate database integrity. Please retry the request, making sure to not duplicate field names with existing entities.")]
53 
57  [Description("Functionality is unavailable due to a missing host watchdog component! This should NOT be seen in a production environment!")]
59 
63  [Description("Cannot update to a different tgstation-server suite version.")]
65 
69  [Description("A required GitHub request returned an API error!")]
71 
75  [Description("A server update was requested while another was in progress")]
77 
81  [Description("Can only change the capitalization of a user's name!")]
83 
87  [Description("Cannot change a user's systemIdentifier!")]
89 
93  [Description("A user cannot have both a name and systemIdentifier!")]
95 
99  [Description("A user cannot have both a password and systemIdentifier!")]
101 
105  [Description("The given password is less than the server's configured minimum password length!")]
107 
111  [Description("User names cannot contain the ':' character!")]
113 
117  [Description("User's name is missing or invalid whitespace!")]
119 
123  [Description("Cannot relocate an instance while it is online!")]
125 
129  [Description("The instance cannot be placed at the given path because it is not empty!")]
131 
135  [Description("Cannot detach an instance while it is online!")]
137 
141  [Description("The instance cannot be placed at the given path because it is a child of an existing instance or the server installation directory!")]
143 
147  [Description("The instance cannot be created because the configured limit has been reached!")]
149 
153  [Description("Instance names cannot be whitespace!")]
155 
159  [Description("The request path requires the 'Instance' header to be set!")]
161 
165  [Description("This operation requires POSIX system identities to be implemented. See https://github.com/tgstation/tgstation-server/issues/709 for details.")]
167 
171  [Description("This existing file hash does not match, the file has beeen updated!")]
173 
177  [Description("The directory cannot be deleted because it is not empty!")]
179 
183  [Description("Cannot clone repository with missing origin field!")]
185 
189  [Description("Either both accessUser and accessToken must be set or neither!")]
191 
195  [Description("The repository is busy being cloned!")]
196  RepoCloning,
197 
201  [Description("The repository is busy with another operation!")]
202  RepoBusy,
203 
207  [Description("The repository already exists!")]
208  RepoExists,
209 
213  [Description("The repository does not exist and must be cloned!")]
214  RepoMissing,
215 
219  [Description("Cannot checkoutSha and set reference at the same time!")]
221 
225  [Description("Cannot checkoutSha and updateFromOrigin at the same time!")]
227 
231  [Description("Cannot change the origin of an existing repository, delete and recreate it instead!")]
233 
237  [Description("The same pull request was present more than once in the test merge requests or is already merged!")]
239 
243  [Description("committerName cannot be whitespace!")]
245 
249  [Description("committerEmail cannot be whitespace!")]
251 
255  [Description("Primary and secondary ports cannot be the same!")]
257 
261  [Description("Deprecated error code.")]
262  [Obsolete("With DMAPI-5.0.0, ultrasafe security is now supported.", true)]
264 
268  [Description("One or more of the channels for one or more of the provided chat bots do not have the correct channel data for their provider!")]
270 
274  [Description("A chat bot's connection string cannot be whitespace!")]
276 
280  [Description("A chat bot's name cannot be whitespace!")]
282 
286  [Description("Missing chat bot provider!")]
288 
292  [Description("Missing user ID!")]
294 
298  [Description("Performing this operation would violate the instance's configured chatBotLimit!")]
299  ChatBotMax,
300 
304  [Description("Set amount of chatChannels exceeds the configured channelLimit!")]
306 
310  [Description("Unable to start DirectX installer process! Is the server running with admin privileges?")]
312 
316  [Description("Error downloading specified BYOND version!")]
318 
322  [Description("Could not acquire lock on BYOND installation as none exist!")]
324 
328  [Description("DreamDaemon exited without validating the DMAPI@")]
330 
334  [Description("The DMAPI sent an invalid validation request!")]
336 
340  [Description("The DreamDaemon startup timeout was hit before the DMAPI validated!")]
342 
346  [Description("No .dme configured and could not automatically detect one!")]
348 
352  [Description("Could not load configured .dme!")]
354 
358  [Description("DreamMaker exited with a non-zero exit code!")]
360 
364  [Description("There is already a deployment operation in progress!")]
366 
370  [Description("Could not retrieve DreamDaemon settings from the database!")]
372 
376  [Description("Could not retrieve DreamMaker settings from the database!")]
378 
382  [Description("Could not retrieve Repository settings from the database!")]
384 
388  [Description("Performing this automatic update as a merge would result in conficts. Aborting!")]
390 
394  [Description("Git credentials are required for this operation!")]
396 
400  [Description("The remote is requesting authentication, but is not allowing credentials to be received!")]
402 
406  [Description("This git operation requires the repository HEAD to currently be on a tracked reference!")]
408 
412  [Description("The watchdog is already running!")]
414 
418  [Description("Cannot launch active compile job as it is missing or corrupted!")]
420 
424  [Description("DreamDaemon failed to start!")]
426 
430  [Description("DreamDaemon failed to start within the configured timeout!")]
432 
436  [Description("Test merging with the current remote is not supported!")]
438 
442  [Description("The value set for checkoutSha or reference should be in the other field!")]
444 
448  [Description("A merge conflict occurred while performing the operation!")]
450 
454  [Description("The repository's current reference is unsuitable for this operation as it does not track a remote reference!")]
456 
460  [Description("Encountered merge conflicts while test merging one or more pull requests!")]
462 
466  [Description("The new instance's path is not under a white-listed path.")]
468 
472  [Description("Cannot set both softShutdown and softReboot at once!")]
474 
478  [Description("Cannot start DreamDaemon headless with the BYOND pager running!")]
480 
484  [Description("Could not bind to requested DreamDaemon port! Is there another service running on that port?")]
486  }
487 }
Either Repository.CheckoutSha or Repository.Reference was in one when it should have been the other...
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel;
3 
4 namespace Tgstation.Server.Api.Models
5 {
10  public enum ErrorCode : uint
11  {
15  [Description("An internal server error occurred!")]
17 
21  [Description("API Mismatch but no current API version provided!")]
23 
27  [Description("The request body was malformed!")]
29 
33  [Description("An IO error occurred during the operation!")]
34  IOError,
35 
39  [Description("A header validation error occurred!")]
40  BadHeaders,
41 
45  [Description("Cannot generate a bearer token using a bearer token!")]
47 
51  [Description("The operation could not be performed as it would violate database integrity. Please retry the request, making sure to not duplicate field names with existing entities.")]
53 
57  [Description("Functionality is unavailable due to a missing host watchdog component! This should NOT be seen in a production environment!")]
59 
63  [Description("Cannot update to a different tgstation-server suite version.")]
65 
69  [Description("A required GitHub request returned an API error!")]
71 
75  [Description("A server update was requested while another was in progress")]
77 
81  [Description("Can only change the capitalization of a user's name!")]
83 
87  [Description("Cannot change a user's systemIdentifier!")]
89 
93  [Description("A user cannot have both a name and systemIdentifier!")]
95 
99  [Description("A user cannot have both a password and systemIdentifier!")]
101 
105  [Description("The given password is less than the server's configured minimum password length!")]
107 
111  [Description("User names cannot contain the ':' character!")]
113 
117  [Description("User's name is missing or invalid whitespace!")]
119 
123  [Description("Cannot relocate an instance while it is online!")]
125 
129  [Description("The instance cannot be placed at the given path because it is not empty!")]
131 
135  [Description("Cannot detach an instance while it is online!")]
137 
141  [Description("The instance cannot be placed at the given path because it is a child of an existing instance or the server installation directory!")]
143 
147  [Description("The instance cannot be created because the configured limit has been reached!")]
149 
153  [Description("Instance names cannot be whitespace!")]
155 
159  [Description("The request path requires the 'Instance' header to be set!")]
161 
165  [Description("This operation requires POSIX system identities to be implemented. See https://github.com/tgstation/tgstation-server/issues/709 for details.")]
167 
171  [Description("This existing file hash does not match, the file has beeen updated!")]
173 
177  [Description("The directory cannot be deleted because it is not empty!")]
179 
183  [Description("Cannot clone repository with missing origin field!")]
185 
189  [Description("Either both accessUser and accessToken must be set or neither!")]
191 
195  [Description("The repository is busy being cloned!")]
196  RepoCloning,
197 
201  [Description("The repository is busy with another operation!")]
202  RepoBusy,
203 
207  [Description("The repository already exists!")]
208  RepoExists,
209 
213  [Description("The repository does not exist and must be cloned!")]
214  RepoMissing,
215 
219  [Description("Cannot checkoutSha and set reference at the same time!")]
221 
225  [Description("Cannot checkoutSha and updateFromOrigin at the same time!")]
227 
231  [Description("Cannot change the origin of an existing repository, delete and recreate it instead!")]
233 
237  [Description("The same pull request was present more than once in the test merge requests or is already merged!")]
239 
243  [Description("committerName cannot be whitespace!")]
245 
249  [Description("committerEmail cannot be whitespace!")]
251 
255  [Description("Primary and secondary ports cannot be the same!")]
257 
261  [Description("Deprecated error code.")]
262  [Obsolete("With DMAPI-5.0.0, ultrasafe security is now supported.", true)]
264 
268  [Description("One or more of the channels for one or more of the provided chat bots do not have the correct channel data for their provider!")]
270 
274  [Description("A chat bot's connection string cannot be whitespace!")]
276 
280  [Description("A chat bot's name cannot be whitespace!")]
282 
286  [Description("Missing chat bot provider!")]
288 
292  [Description("Missing user ID!")]
294 
298  [Description("Performing this operation would violate the instance's configured chatBotLimit!")]
299  ChatBotMax,
300 
304  [Description("Set amount of chatChannels exceeds the configured channelLimit!")]
306 
310  [Description("Unable to start DirectX installer process! Is the server running with admin privileges?")]
312 
316  [Description("Error downloading specified BYOND version!")]
318 
322  [Description("Could not acquire lock on BYOND installation as none exist!")]
324 
328  [Description("DreamDaemon exited without validating the DMAPI@")]
330 
334  [Description("The DMAPI sent an invalid validation request!")]
336 
340  [Description("The DreamDaemon startup timeout was hit before the DMAPI validated!")]
342 
346  [Description("No .dme configured and could not automatically detect one!")]
348 
352  [Description("Could not load configured .dme!")]
354 
358  [Description("DreamMaker exited with a non-zero exit code!")]
360 
364  [Description("There is already a deployment operation in progress!")]
366 
370  [Description("Could not retrieve DreamDaemon settings from the database!")]
372 
376  [Description("Could not retrieve DreamMaker settings from the database!")]
378 
382  [Description("Could not retrieve Repository settings from the database!")]
384 
388  [Description("Performing this automatic update as a merge would result in conficts. Aborting!")]
390 
394  [Description("Git credentials are required for this operation!")]
396 
400  [Description("The remote is requesting authentication, but is not allowing credentials to be received!")]
402 
406  [Description("This git operation requires the repository HEAD to currently be on a tracked reference!")]
408 
412  [Description("The watchdog is already running!")]
414 
418  [Description("Cannot launch active compile job as it is missing or corrupted!")]
420 
424  [Description("DreamDaemon failed to start!")]
426 
430  [Description("DreamDaemon failed to start within the configured timeout!")]
432 
436  [Description("Test merging with the current remote is not supported!")]
438 
442  [Description("The value set for checkoutSha or reference should be in the other field!")]
444 
448  [Description("A merge conflict occurred while performing the operation!")]
450 
454  [Description("The repository's current reference is unsuitable for this operation as it does not track a remote reference!")]
456 
460  [Description("Encountered merge conflicts while test merging one or more pull requests!")]
462 
466  [Description("The new instance's path is not under a white-listed path.")]
468 
472  [Description("Cannot set both softShutdown and softReboot at once!")]
474 
478  [Description("Cannot start DreamDaemon headless with the BYOND pager running!")]
480 
484  [Description("Could not bind to requested DreamDaemon port! Is there another service running on that port?")]
486 
490  [Description("The deployment succeeded but one or more notification events failed!")]
492  }
493 }
Either Repository.CheckoutSha or Repository.Reference was in one when it should have been the other...
The remote returned an invalid authentication request.
Attempted to create a User with a or whitespace Internal.User.Name.
Attempted to create a User with a &#39;:&#39; in the Internal.User.Name.
@@ -148,6 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Attempted to Repository.CheckoutSha and set Repository.Reference at the same time.
Attempted to change a Internal.User.SystemIdentifier.
The given UserUpdate.Password length was less than the server&#39;s configured minimum.
+
Failed to post GitHub comments, send chat message, or send TGS event.
Internal.ChatBot.ConnectionString was whitespace.
The current Repository.Reference does not track a remote reference.
Attempted to change a Instance.Path while it was Instance.Online.
diff --git a/_error_code_extensions_8cs.html b/_error_code_extensions_8cs.html index c38cc735e8..43e3f3ca35 100644 --- a/_error_code_extensions_8cs.html +++ b/_error_code_extensions_8cs.html @@ -25,7 +25,7 @@
diff --git a/_error_code_extensions_8cs_source.html b/_error_code_extensions_8cs_source.html index 8b3d7471db..e94d09a174 100644 --- a/_error_code_extensions_8cs_source.html +++ b/_error_code_extensions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_error_message_8cs.html b/_error_message_8cs.html index e7c44d37e5..6b7a31a342 100644 --- a/_error_message_8cs.html +++ b/_error_message_8cs.html @@ -25,7 +25,7 @@ diff --git a/_error_message_8cs_source.html b/_error_message_8cs_source.html index d419814a69..cb5588e17a 100644 --- a/_error_message_8cs_source.html +++ b/_error_message_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_event_consumer_8cs.html b/_event_consumer_8cs.html index 4c4d69ab3b..b38536e6e5 100644 --- a/_event_consumer_8cs.html +++ b/_event_consumer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_event_consumer_8cs_source.html b/_event_consumer_8cs_source.html index 5c207ccbc5..aba618b648 100644 --- a/_event_consumer_8cs_source.html +++ b/_event_consumer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_event_notification_8cs.html b/_event_notification_8cs.html index ccaabf017d..0f9a6a2255 100644 --- a/_event_notification_8cs.html +++ b/_event_notification_8cs.html @@ -25,7 +25,7 @@ diff --git a/_event_notification_8cs_source.html b/_event_notification_8cs_source.html index f61afc4fec..ecd2679a61 100644 --- a/_event_notification_8cs_source.html +++ b/_event_notification_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_event_type_8cs.html b/_event_type_8cs.html index 0b9a84c663..dcfdde4c8b 100644 --- a/_event_type_8cs.html +++ b/_event_type_8cs.html @@ -25,7 +25,7 @@ diff --git a/_event_type_8cs_source.html b/_event_type_8cs_source.html index 0be49d9724..5cdbe4d859 100644 --- a/_event_type_8cs_source.html +++ b/_event_type_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_experimental_watchdog_8cs.html b/_experimental_watchdog_8cs.html index d661bb5bc2..f0c3825b78 100644 --- a/_experimental_watchdog_8cs.html +++ b/_experimental_watchdog_8cs.html @@ -25,7 +25,7 @@ diff --git a/_experimental_watchdog_8cs_source.html b/_experimental_watchdog_8cs_source.html index d439d58610..dc7f7c99a2 100644 --- a/_experimental_watchdog_8cs_source.html +++ b/_experimental_watchdog_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_features_8dox.html b/_features_8dox.html index 3465fc2da6..a5b40949ae 100644 --- a/_features_8dox.html +++ b/_features_8dox.html @@ -25,7 +25,7 @@ diff --git a/_file_logging_configuration_8cs.html b/_file_logging_configuration_8cs.html index 7f1f884860..60211564a4 100644 --- a/_file_logging_configuration_8cs.html +++ b/_file_logging_configuration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_file_logging_configuration_8cs_source.html b/_file_logging_configuration_8cs_source.html index ae8c311d09..8dfd45a0fa 100644 --- a/_file_logging_configuration_8cs_source.html +++ b/_file_logging_configuration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_general_configuration_8cs.html b/_general_configuration_8cs.html index b28c330b31..1a1d1fed76 100644 --- a/_general_configuration_8cs.html +++ b/_general_configuration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_general_configuration_8cs_source.html b/_general_configuration_8cs_source.html index 3245d37e0c..258a6338dd 100644 --- a/_general_configuration_8cs_source.html +++ b/_general_configuration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_git_hub_client_factory_8cs.html b/_git_hub_client_factory_8cs.html index 319d8bd72e..55225a5932 100644 --- a/_git_hub_client_factory_8cs.html +++ b/_git_hub_client_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_git_hub_client_factory_8cs_source.html b/_git_hub_client_factory_8cs_source.html index d0633a1e3c..5540ec6c30 100644 --- a/_git_hub_client_factory_8cs_source.html +++ b/_git_hub_client_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_global_suppressions_8cs.html b/_global_suppressions_8cs.html index 62a41d91f3..52ae3cfb33 100644 --- a/_global_suppressions_8cs.html +++ b/_global_suppressions_8cs.html @@ -25,7 +25,7 @@ diff --git a/_global_suppressions_8cs_source.html b/_global_suppressions_8cs_source.html index 35b951adee..a5f6e29516 100644 --- a/_global_suppressions_8cs_source.html +++ b/_global_suppressions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_home_controller_8cs.html b/_home_controller_8cs.html index 8c66940eed..49a956bb18 100644 --- a/_home_controller_8cs.html +++ b/_home_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_home_controller_8cs_source.html b/_home_controller_8cs_source.html index 21337df2ce..875665d8d6 100644 --- a/_home_controller_8cs_source.html +++ b/_home_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -109,17 +109,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
string Username
The client&#39;s username
Definition: ApiHeaders.cs:92
Contains various cryptographic functions
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the HomeController
- +
Backend abstract implementation of IDatabaseContext
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:17
readonly ControlPanelConfiguration controlPanelConfiguration
The ControlPanelConfiguration for the HomeController
-
DbSet< User > Users
The Users in the DatabaseContext<TParentContext>.
+
DbSet< User > Users
The Users in the DatabaseContext<TParentContext>.
string Password
The client&#39;s password
Definition: ApiHeaders.cs:97
Routes to a server actions
Definition: Routes.cs:9
Main ApiController for the Application
- +
HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IAssemblyInformationProvider assemblyInformationProvider, IIdentityCache identityCache, IBrowserResolver browserResolver, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< HomeController > logger)
Construct a HomeController
diff --git a/_host_builder_extensions_8cs.html b/_host_builder_extensions_8cs.html index 08454a7458..4d8be32f24 100644 --- a/_host_builder_extensions_8cs.html +++ b/_host_builder_extensions_8cs.html @@ -25,7 +25,7 @@
diff --git a/_host_builder_extensions_8cs_source.html b/_host_builder_extensions_8cs_source.html index 457b394024..d192a9ec3a 100644 --- a/_host_builder_extensions_8cs_source.html +++ b/_host_builder_extensions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_http_client_8cs.html b/_http_client_8cs.html index e5fe6f1b9c..0cea4fb780 100644 --- a/_http_client_8cs.html +++ b/_http_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_http_client_8cs_source.html b/_http_client_8cs_source.html index 4f4e67a0e2..003d6deed8 100644 --- a/_http_client_8cs_source.html +++ b/_http_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_administration_client_8cs.html b/_i_administration_client_8cs.html index 03ad5c98a7..28577e5ec6 100644 --- a/_i_administration_client_8cs.html +++ b/_i_administration_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_administration_client_8cs_source.html b/_i_administration_client_8cs_source.html index eba3077a6c..7834964daf 100644 --- a/_i_administration_client_8cs_source.html +++ b/_i_administration_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_api_client_8cs.html b/_i_api_client_8cs.html index 4c803e277c..4010c09911 100644 --- a/_i_api_client_8cs.html +++ b/_i_api_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_api_client_8cs_source.html b/_i_api_client_8cs_source.html index 037b627ee3..392d405b90 100644 --- a/_i_api_client_8cs_source.html +++ b/_i_api_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_api_client_factory_8cs.html b/_i_api_client_factory_8cs.html index 59db25e63e..826f5b57b5 100644 --- a/_i_api_client_factory_8cs.html +++ b/_i_api_client_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_api_client_factory_8cs_source.html b/_i_api_client_factory_8cs_source.html index f750efa45a..63aabf8dd9 100644 --- a/_i_api_client_factory_8cs_source.html +++ b/_i_api_client_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_assembly_information_provider_8cs.html b/_i_assembly_information_provider_8cs.html index 8716c0385e..7821a3928d 100644 --- a/_i_assembly_information_provider_8cs.html +++ b/_i_assembly_information_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_assembly_information_provider_8cs_source.html b/_i_assembly_information_provider_8cs_source.html index e6d6d26266..4886751983 100644 --- a/_i_assembly_information_provider_8cs_source.html +++ b/_i_assembly_information_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_async_delayer_8cs.html b/_i_async_delayer_8cs.html index db704bdfee..60379224a9 100644 --- a/_i_async_delayer_8cs.html +++ b/_i_async_delayer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_async_delayer_8cs_source.html b/_i_async_delayer_8cs_source.html index a2856afefc..6417cfb57a 100644 --- a/_i_async_delayer_8cs_source.html +++ b/_i_async_delayer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_authentication_context_8cs.html b/_i_authentication_context_8cs.html index 21195bc7ef..ab68607c89 100644 --- a/_i_authentication_context_8cs.html +++ b/_i_authentication_context_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_authentication_context_8cs_source.html b/_i_authentication_context_8cs_source.html index cc081f2543..f3df1c60b7 100644 --- a/_i_authentication_context_8cs_source.html +++ b/_i_authentication_context_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_authentication_context_factory_8cs.html b/_i_authentication_context_factory_8cs.html index 7868d164e4..13ffefb7f7 100644 --- a/_i_authentication_context_factory_8cs.html +++ b/_i_authentication_context_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_authentication_context_factory_8cs_source.html b/_i_authentication_context_factory_8cs_source.html index 496b7d85e9..523ac13e6f 100644 --- a/_i_authentication_context_factory_8cs_source.html +++ b/_i_authentication_context_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_dispatcher_8cs.html b/_i_bridge_dispatcher_8cs.html index ea298ce75a..0a02cb6651 100644 --- a/_i_bridge_dispatcher_8cs.html +++ b/_i_bridge_dispatcher_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_dispatcher_8cs_source.html b/_i_bridge_dispatcher_8cs_source.html index 652316282b..b04e73608b 100644 --- a/_i_bridge_dispatcher_8cs_source.html +++ b/_i_bridge_dispatcher_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_handler_8cs.html b/_i_bridge_handler_8cs.html index f2351d66e6..b777857b3b 100644 --- a/_i_bridge_handler_8cs.html +++ b/_i_bridge_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_handler_8cs_source.html b/_i_bridge_handler_8cs_source.html index 5ad9d50868..b49780fdfd 100644 --- a/_i_bridge_handler_8cs_source.html +++ b/_i_bridge_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_registrar_8cs.html b/_i_bridge_registrar_8cs.html index f6e0b382a3..3ec4aa7137 100644 --- a/_i_bridge_registrar_8cs.html +++ b/_i_bridge_registrar_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_registrar_8cs_source.html b/_i_bridge_registrar_8cs_source.html index 7d8bd5592b..d65bbb11d0 100644 --- a/_i_bridge_registrar_8cs_source.html +++ b/_i_bridge_registrar_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_registration_8cs.html b/_i_bridge_registration_8cs.html index e5290739a6..70b29e9086 100644 --- a/_i_bridge_registration_8cs.html +++ b/_i_bridge_registration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_bridge_registration_8cs_source.html b/_i_bridge_registration_8cs_source.html index afffe6e5a3..6434bc9477 100644 --- a/_i_bridge_registration_8cs_source.html +++ b/_i_bridge_registration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_client_8cs.html b/_i_byond_client_8cs.html index a17d5e08c2..f38c6e6ae7 100644 --- a/_i_byond_client_8cs.html +++ b/_i_byond_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_client_8cs_source.html b/_i_byond_client_8cs_source.html index 605a6cbd6b..96cd1851d2 100644 --- a/_i_byond_client_8cs_source.html +++ b/_i_byond_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_executable_lock_8cs.html b/_i_byond_executable_lock_8cs.html index 3ddfaa334a..0a2c5f26ab 100644 --- a/_i_byond_executable_lock_8cs.html +++ b/_i_byond_executable_lock_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_executable_lock_8cs_source.html b/_i_byond_executable_lock_8cs_source.html index 2d201afc59..1697f45cac 100644 --- a/_i_byond_executable_lock_8cs_source.html +++ b/_i_byond_executable_lock_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_installer_8cs.html b/_i_byond_installer_8cs.html index 3dd8a3279b..5a9eede784 100644 --- a/_i_byond_installer_8cs.html +++ b/_i_byond_installer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_installer_8cs_source.html b/_i_byond_installer_8cs_source.html index e7fcae14ad..21d175663c 100644 --- a/_i_byond_installer_8cs_source.html +++ b/_i_byond_installer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_manager_8cs.html b/_i_byond_manager_8cs.html index 94df1fda58..6dec499636 100644 --- a/_i_byond_manager_8cs.html +++ b/_i_byond_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_byond_manager_8cs_source.html b/_i_byond_manager_8cs_source.html index 7af9f6a45b..334aaa8cea 100644 --- a/_i_byond_manager_8cs_source.html +++ b/_i_byond_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_channel_sink_8cs.html b/_i_channel_sink_8cs.html index 91c517c993..2f40707f45 100644 --- a/_i_channel_sink_8cs.html +++ b/_i_channel_sink_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_channel_sink_8cs_source.html b/_i_channel_sink_8cs_source.html index 95949c3a84..3805d25c0f 100644 --- a/_i_channel_sink_8cs_source.html +++ b/_i_channel_sink_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_bots_client_8cs.html b/_i_chat_bots_client_8cs.html index 05651961d1..842b9796b4 100644 --- a/_i_chat_bots_client_8cs.html +++ b/_i_chat_bots_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_bots_client_8cs_source.html b/_i_chat_bots_client_8cs_source.html index 6d582b76df..bc680f2d60 100644 --- a/_i_chat_bots_client_8cs_source.html +++ b/_i_chat_bots_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_manager_8cs.html b/_i_chat_manager_8cs.html index a4d1efc098..37b700f6b5 100644 --- a/_i_chat_manager_8cs.html +++ b/_i_chat_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_manager_8cs_source.html b/_i_chat_manager_8cs_source.html index b00d7dcd98..ae6f37f0c5 100644 --- a/_i_chat_manager_8cs_source.html +++ b/_i_chat_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_manager_factory_8cs.html b/_i_chat_manager_factory_8cs.html index 8d1e1b1572..49268a7e3b 100644 --- a/_i_chat_manager_factory_8cs.html +++ b/_i_chat_manager_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_manager_factory_8cs_source.html b/_i_chat_manager_factory_8cs_source.html index 72b6afeedb..cc5419d095 100644 --- a/_i_chat_manager_factory_8cs_source.html +++ b/_i_chat_manager_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_tracking_context_8cs.html b/_i_chat_tracking_context_8cs.html index 7cbb1fa2d1..dc7a86d0b3 100644 --- a/_i_chat_tracking_context_8cs.html +++ b/_i_chat_tracking_context_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_chat_tracking_context_8cs_source.html b/_i_chat_tracking_context_8cs_source.html index 7d40eaad9f..85c2e3aa1c 100644 --- a/_i_chat_tracking_context_8cs_source.html +++ b/_i_chat_tracking_context_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_claims_injector_8cs.html b/_i_claims_injector_8cs.html index 38ac2ee51f..471d8c1dd9 100644 --- a/_i_claims_injector_8cs.html +++ b/_i_claims_injector_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_claims_injector_8cs_source.html b/_i_claims_injector_8cs_source.html index 612cf35a5a..8ac6927ed2 100644 --- a/_i_claims_injector_8cs_source.html +++ b/_i_claims_injector_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_command_8cs.html b/_i_command_8cs.html index 259ac25174..7d80bdc796 100644 --- a/_i_command_8cs.html +++ b/_i_command_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_command_8cs_source.html b/_i_command_8cs_source.html index 9b48ce9a32..822ac9232a 100644 --- a/_i_command_8cs_source.html +++ b/_i_command_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_command_factory_8cs.html b/_i_command_factory_8cs.html index 8ef5f141ca..4362ee5ff1 100644 --- a/_i_command_factory_8cs.html +++ b/_i_command_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_command_factory_8cs_source.html b/_i_command_factory_8cs_source.html index 59f7245751..f88267dd35 100644 --- a/_i_command_factory_8cs_source.html +++ b/_i_command_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_compile_job_sink_8cs.html b/_i_compile_job_sink_8cs.html index 5026ab9530..1d1218d590 100644 --- a/_i_compile_job_sink_8cs.html +++ b/_i_compile_job_sink_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_compile_job_sink_8cs_source.html b/_i_compile_job_sink_8cs_source.html index 2093be5a64..993f18dd83 100644 --- a/_i_compile_job_sink_8cs_source.html +++ b/_i_compile_job_sink_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_configuration_8cs.html b/_i_configuration_8cs.html index 1f6f3552fe..cb60192f6e 100644 --- a/_i_configuration_8cs.html +++ b/_i_configuration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_configuration_8cs_source.html b/_i_configuration_8cs_source.html index 5673f95550..fa8c30b49e 100644 --- a/_i_configuration_8cs_source.html +++ b/_i_configuration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_configuration_client_8cs.html b/_i_configuration_client_8cs.html index 4d0cae2608..2ea6525240 100644 --- a/_i_configuration_client_8cs.html +++ b/_i_configuration_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_configuration_client_8cs_source.html b/_i_configuration_client_8cs_source.html index cc8a004f29..fafa46a970 100644 --- a/_i_configuration_client_8cs_source.html +++ b/_i_configuration_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_console_8cs.html b/_i_console_8cs.html index 6443ea4e33..919584f920 100644 --- a/_i_console_8cs.html +++ b/_i_console_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_console_8cs_source.html b/_i_console_8cs_source.html index 335f178d49..000ef2e33e 100644 --- a/_i_console_8cs_source.html +++ b/_i_console_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_credentials_provider_8cs.html b/_i_credentials_provider_8cs.html index 1fba3cd3f4..056b6d9f34 100644 --- a/_i_credentials_provider_8cs.html +++ b/_i_credentials_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_credentials_provider_8cs_source.html b/_i_credentials_provider_8cs_source.html index d3ba38d8bc..05e374fc7c 100644 --- a/_i_credentials_provider_8cs_source.html +++ b/_i_credentials_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_cryptography_suite_8cs.html b/_i_cryptography_suite_8cs.html index 8f40f9b40d..c62ae4cb41 100644 --- a/_i_cryptography_suite_8cs.html +++ b/_i_cryptography_suite_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_cryptography_suite_8cs_source.html b/_i_cryptography_suite_8cs_source.html index ba66c56667..84719539ce 100644 --- a/_i_cryptography_suite_8cs_source.html +++ b/_i_cryptography_suite_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_custom_command_handler_8cs.html b/_i_custom_command_handler_8cs.html index 0ec46c3f15..24599b001e 100644 --- a/_i_custom_command_handler_8cs.html +++ b/_i_custom_command_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_custom_command_handler_8cs_source.html b/_i_custom_command_handler_8cs_source.html index 9bbc3323ea..e9b87ee692 100644 --- a/_i_custom_command_handler_8cs_source.html +++ b/_i_custom_command_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_database_collection_8cs.html b/_i_database_collection_8cs.html index 041bad76bb..42f556afd6 100644 --- a/_i_database_collection_8cs.html +++ b/_i_database_collection_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_database_collection_8cs_source.html b/_i_database_collection_8cs_source.html index 39cc2be09b..f818514197 100644 --- a/_i_database_collection_8cs_source.html +++ b/_i_database_collection_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_database_connection_factory_8cs.html b/_i_database_connection_factory_8cs.html index 973fe12560..6d96157b97 100644 --- a/_i_database_connection_factory_8cs.html +++ b/_i_database_connection_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_database_connection_factory_8cs_source.html b/_i_database_connection_factory_8cs_source.html index 95ba6fcddb..05f4def9e8 100644 --- a/_i_database_connection_factory_8cs_source.html +++ b/_i_database_connection_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_database_context_8cs.html b/_i_database_context_8cs.html index cc1e89b506..9eeea9b7ec 100644 --- a/_i_database_context_8cs.html +++ b/_i_database_context_8cs.html @@ -25,7 +25,7 @@ @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

diff --git a/_database_context_8cs_source.html b/_database_context_8cs_source.html index 7e5556104e..77300755cb 100644 --- a/_database_context_8cs_source.html +++ b/_database_context_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
 Types of ErrorMessages that the API may return. More...
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite

Classes

interface  Tgstation.Server.Host.Database.IDatabaseContext
 Represents the database More...
 Represents the database. More...
 
@@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
diff --git a/_i_database_context_factory_8cs.html b/_i_database_context_factory_8cs.html index d3f9647fe8..c080f5dd0a 100644 --- a/_i_database_context_factory_8cs.html +++ b/_i_database_context_factory_8cs.html @@ -25,7 +25,7 @@
@@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

diff --git a/_i_database_context_8cs_source.html b/_i_database_context_8cs_source.html index 1307c6debb..63f69aa936 100644 --- a/_i_database_context_8cs_source.html +++ b/_i_database_context_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite

Classes

interface  Tgstation.Server.Host.Database.IDatabaseContextFactory
 Factory for scoping usage of IDatabaseContexts. Meant for use by Components More...
 Factory for scoping usage of IDatabaseContexts. Meant for use by Components More...
 
diff --git a/_i_database_seeder_8cs.html b/_i_database_seeder_8cs.html index abe72f8f88..b2c953bd9a 100644 --- a/_i_database_seeder_8cs.html +++ b/_i_database_seeder_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_database_seeder_8cs_source.html b/_i_database_seeder_8cs_source.html index c22443824a..e66092d9d1 100644 --- a/_i_database_seeder_8cs_source.html +++ b/_i_database_seeder_8cs_source.html @@ -25,7 +25,7 @@ @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
4 namespace Tgstation.Server.Host.Database
5 {
9  interface IDatabaseSeeder
10  {
17  Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken);
18 
25  Task SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken);
26 
33  Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken);
34  }
35 }
For initially seeding a database
- +
diff --git a/_i_dmb_factory_8cs.html b/_i_dmb_factory_8cs.html index aa165078fd..93c80bd215 100644 --- a/_i_dmb_factory_8cs.html +++ b/_i_dmb_factory_8cs.html @@ -25,7 +25,7 @@
diff --git a/_i_dmb_factory_8cs_source.html b/_i_dmb_factory_8cs_source.html index ba6b28d3da..3ebaa0f80f 100644 --- a/_i_dmb_factory_8cs_source.html +++ b/_i_dmb_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_dmb_provider_8cs.html b/_i_dmb_provider_8cs.html index 590cda021d..02ea1af968 100644 --- a/_i_dmb_provider_8cs.html +++ b/_i_dmb_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_dmb_provider_8cs_source.html b/_i_dmb_provider_8cs_source.html index ebbeeaad7e..0d54418efd 100644 --- a/_i_dmb_provider_8cs_source.html +++ b/_i_dmb_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_daemon_client_8cs.html b/_i_dream_daemon_client_8cs.html index 1e4f05b2f5..700d2b33b4 100644 --- a/_i_dream_daemon_client_8cs.html +++ b/_i_dream_daemon_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_daemon_client_8cs_source.html b/_i_dream_daemon_client_8cs_source.html index 1638f0f3a8..978d088c99 100644 --- a/_i_dream_daemon_client_8cs_source.html +++ b/_i_dream_daemon_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_maker_8cs.html b/_i_dream_maker_8cs.html index 5bbea46138..c6a1978754 100644 --- a/_i_dream_maker_8cs.html +++ b/_i_dream_maker_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_maker_8cs_source.html b/_i_dream_maker_8cs_source.html index afdd09ef2f..38499b3357 100644 --- a/_i_dream_maker_8cs_source.html +++ b/_i_dream_maker_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_maker_client_8cs.html b/_i_dream_maker_client_8cs.html index 4ef36cecac..520cc48a91 100644 --- a/_i_dream_maker_client_8cs.html +++ b/_i_dream_maker_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_dream_maker_client_8cs_source.html b/_i_dream_maker_client_8cs_source.html index 30c2784906..9fe6b928d8 100644 --- a/_i_dream_maker_client_8cs_source.html +++ b/_i_dream_maker_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_event_consumer_8cs.html b/_i_event_consumer_8cs.html index 7109f89d85..794f525f19 100644 --- a/_i_event_consumer_8cs.html +++ b/_i_event_consumer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_event_consumer_8cs_source.html b/_i_event_consumer_8cs_source.html index 502128e968..ac3a1937e4 100644 --- a/_i_event_consumer_8cs_source.html +++ b/_i_event_consumer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_git_hub_client_factory_8cs.html b/_i_git_hub_client_factory_8cs.html index 82709b099c..917520cc84 100644 --- a/_i_git_hub_client_factory_8cs.html +++ b/_i_git_hub_client_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_git_hub_client_factory_8cs_source.html b/_i_git_hub_client_factory_8cs_source.html index 511cde5e87..b101b1edfc 100644 --- a/_i_git_hub_client_factory_8cs_source.html +++ b/_i_git_hub_client_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_http_client_8cs.html b/_i_http_client_8cs.html index b0e7e353d2..cef82a05a0 100644 --- a/_i_http_client_8cs.html +++ b/_i_http_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_http_client_8cs_source.html b/_i_http_client_8cs_source.html index 3227f6e2ad..16d7b9498a 100644 --- a/_i_http_client_8cs_source.html +++ b/_i_http_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_i_o_manager_8cs.html b/_i_i_o_manager_8cs.html index ace39cb9e5..13f7f19bb4 100644 --- a/_i_i_o_manager_8cs.html +++ b/_i_i_o_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_i_o_manager_8cs_source.html b/_i_i_o_manager_8cs_source.html index 0ac2314d1b..1489b5e491 100644 --- a/_i_i_o_manager_8cs_source.html +++ b/_i_i_o_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_identity_cache_8cs.html b/_i_identity_cache_8cs.html index 3cd88906ba..670715ead9 100644 --- a/_i_identity_cache_8cs.html +++ b/_i_identity_cache_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_identity_cache_8cs_source.html b/_i_identity_cache_8cs_source.html index a8f9651104..f62ad3b8d5 100644 --- a/_i_identity_cache_8cs_source.html +++ b/_i_identity_cache_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_8cs.html b/_i_instance_8cs.html index 0eeb24331f..7a875f1f64 100644 --- a/_i_instance_8cs.html +++ b/_i_instance_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_8cs_source.html b/_i_instance_8cs_source.html index 0e6ec2baf0..5ed379fd33 100644 --- a/_i_instance_8cs_source.html +++ b/_i_instance_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_client_8cs.html b/_i_instance_client_8cs.html index 16d3c35e2c..373f68e050 100644 --- a/_i_instance_client_8cs.html +++ b/_i_instance_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_client_8cs_source.html b/_i_instance_client_8cs_source.html index b2c0af7458..694693d7b6 100644 --- a/_i_instance_client_8cs_source.html +++ b/_i_instance_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_factory_8cs.html b/_i_instance_factory_8cs.html index 6914841d2b..820b118707 100644 --- a/_i_instance_factory_8cs.html +++ b/_i_instance_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_factory_8cs_source.html b/_i_instance_factory_8cs_source.html index f458478a9d..6e7d8cebc1 100644 --- a/_i_instance_factory_8cs_source.html +++ b/_i_instance_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_manager_8cs.html b/_i_instance_manager_8cs.html index cbc2d6ee78..a0300352f6 100644 --- a/_i_instance_manager_8cs.html +++ b/_i_instance_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_manager_8cs_source.html b/_i_instance_manager_8cs_source.html index cbe4c66149..6eb0c99bba 100644 --- a/_i_instance_manager_8cs_source.html +++ b/_i_instance_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_manager_client_8cs.html b/_i_instance_manager_client_8cs.html index 88282f4e7a..574d66030a 100644 --- a/_i_instance_manager_client_8cs.html +++ b/_i_instance_manager_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_manager_client_8cs_source.html b/_i_instance_manager_client_8cs_source.html index c336c50480..d9cc9172ca 100644 --- a/_i_instance_manager_client_8cs_source.html +++ b/_i_instance_manager_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_user_client_8cs.html b/_i_instance_user_client_8cs.html index 589ca9d0ef..6710f9262a 100644 --- a/_i_instance_user_client_8cs.html +++ b/_i_instance_user_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_instance_user_client_8cs_source.html b/_i_instance_user_client_8cs_source.html index 57e027095f..f24ad93e43 100644 --- a/_i_instance_user_client_8cs_source.html +++ b/_i_instance_user_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_job_manager_8cs.html b/_i_job_manager_8cs.html index 2b18b5f116..128f95ec4f 100644 --- a/_i_job_manager_8cs.html +++ b/_i_job_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_job_manager_8cs_source.html b/_i_job_manager_8cs_source.html index ad22b74c78..fe99cedcc6 100644 --- a/_i_job_manager_8cs_source.html +++ b/_i_job_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_jobs_client_8cs.html b/_i_jobs_client_8cs.html index edf95bf7b0..b72229230d 100644 --- a/_i_jobs_client_8cs.html +++ b/_i_jobs_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_jobs_client_8cs_source.html b/_i_jobs_client_8cs_source.html index 569ad1e3a3..5c9369ad1e 100644 --- a/_i_jobs_client_8cs_source.html +++ b/_i_jobs_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_latest_compile_job_provider_8cs.html b/_i_latest_compile_job_provider_8cs.html index 325200f3f9..92ffef40f1 100644 --- a/_i_latest_compile_job_provider_8cs.html +++ b/_i_latest_compile_job_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_latest_compile_job_provider_8cs_source.html b/_i_latest_compile_job_provider_8cs_source.html index 949e5bd18f..8e405f5427 100644 --- a/_i_latest_compile_job_provider_8cs_source.html +++ b/_i_latest_compile_job_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_lib_git2_commands_8cs.html b/_i_lib_git2_commands_8cs.html index 8e4ee63f0a..13a6093a03 100644 --- a/_i_lib_git2_commands_8cs.html +++ b/_i_lib_git2_commands_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_lib_git2_commands_8cs_source.html b/_i_lib_git2_commands_8cs_source.html index 76e907f1c2..ec06445811 100644 --- a/_i_lib_git2_commands_8cs_source.html +++ b/_i_lib_git2_commands_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_lib_git2_repository_factory_8cs.html b/_i_lib_git2_repository_factory_8cs.html index cac0f39d9d..cfbf1a75d4 100644 --- a/_i_lib_git2_repository_factory_8cs.html +++ b/_i_lib_git2_repository_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_lib_git2_repository_factory_8cs_source.html b/_i_lib_git2_repository_factory_8cs_source.html index 8caa84352b..ec5bfe5441 100644 --- a/_i_lib_git2_repository_factory_8cs_source.html +++ b/_i_lib_git2_repository_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_network_prompt_reaper_8cs.html b/_i_network_prompt_reaper_8cs.html index 12ff6271e5..5daa9af82e 100644 --- a/_i_network_prompt_reaper_8cs.html +++ b/_i_network_prompt_reaper_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_network_prompt_reaper_8cs_source.html b/_i_network_prompt_reaper_8cs_source.html index d501097e17..c4ecbd3b27 100644 --- a/_i_network_prompt_reaper_8cs_source.html +++ b/_i_network_prompt_reaper_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_platform_identifier_8cs.html b/_i_platform_identifier_8cs.html index f899084e26..62a8ac187e 100644 --- a/_i_platform_identifier_8cs.html +++ b/_i_platform_identifier_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_platform_identifier_8cs_source.html b/_i_platform_identifier_8cs_source.html index 39fd3622f9..911b160a12 100644 --- a/_i_platform_identifier_8cs_source.html +++ b/_i_platform_identifier_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_post_setup_services_8cs.html b/_i_post_setup_services_8cs.html index 68a49fbda7..012baf923d 100644 --- a/_i_post_setup_services_8cs.html +++ b/_i_post_setup_services_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_post_setup_services_8cs_source.html b/_i_post_setup_services_8cs_source.html index 4b681589c1..8cec1c104d 100644 --- a/_i_post_setup_services_8cs_source.html +++ b/_i_post_setup_services_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_post_write_handler_8cs.html b/_i_post_write_handler_8cs.html index d244b7bc96..8ea50527f2 100644 --- a/_i_post_write_handler_8cs.html +++ b/_i_post_write_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_post_write_handler_8cs_source.html b/_i_post_write_handler_8cs_source.html index 47a8942813..40214a6574 100644 --- a/_i_post_write_handler_8cs_source.html +++ b/_i_post_write_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_process_8cs.html b/_i_process_8cs.html index 0c1392798a..03d0e7649d 100644 --- a/_i_process_8cs.html +++ b/_i_process_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_process_8cs_source.html b/_i_process_8cs_source.html index 74f3c8334b..3c1cfa3fbe 100644 --- a/_i_process_8cs_source.html +++ b/_i_process_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_process_base_8cs.html b/_i_process_base_8cs.html index 7aa0df68b0..b8999bbaef 100644 --- a/_i_process_base_8cs.html +++ b/_i_process_base_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_process_base_8cs_source.html b/_i_process_base_8cs_source.html index 75cdd53ebd..4a0a913683 100644 --- a/_i_process_base_8cs_source.html +++ b/_i_process_base_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_process_executor_8cs.html b/_i_process_executor_8cs.html index 2e1a06b067..fe8a20b242 100644 --- a/_i_process_executor_8cs.html +++ b/_i_process_executor_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_process_executor_8cs_source.html b/_i_process_executor_8cs_source.html index 38c6eb1db7..6e529d1a51 100644 --- a/_i_process_executor_8cs_source.html +++ b/_i_process_executor_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_process_features_8cs.html b/_i_process_features_8cs.html index 35c952158a..ae16906ae3 100644 --- a/_i_process_features_8cs.html +++ b/_i_process_features_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_process_features_8cs_source.html b/_i_process_features_8cs_source.html index 90e6deed4d..5fbbeb1d7f 100644 --- a/_i_process_features_8cs_source.html +++ b/_i_process_features_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_provider_8cs.html b/_i_provider_8cs.html index 775136c1f2..f38c7a08f0 100644 --- a/_i_provider_8cs.html +++ b/_i_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_provider_8cs_source.html b/_i_provider_8cs_source.html index 450e5f8df8..b17aea4de8 100644 --- a/_i_provider_8cs_source.html +++ b/_i_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_provider_factory_8cs.html b/_i_provider_factory_8cs.html index c9cfe3cab2..275a1c7c2d 100644 --- a/_i_provider_factory_8cs.html +++ b/_i_provider_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_provider_factory_8cs_source.html b/_i_provider_factory_8cs_source.html index 973a22404c..53ee8132d0 100644 --- a/_i_provider_factory_8cs_source.html +++ b/_i_provider_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_reattach_info_handler_8cs.html b/_i_reattach_info_handler_8cs.html index 5db86a0137..e2b7795cfa 100644 --- a/_i_reattach_info_handler_8cs.html +++ b/_i_reattach_info_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_reattach_info_handler_8cs_source.html b/_i_reattach_info_handler_8cs_source.html index 3b024047ef..dee48b57c5 100644 --- a/_i_reattach_info_handler_8cs_source.html +++ b/_i_reattach_info_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_8cs.html b/_i_repository_8cs.html index 209ea895da..f48a934ba4 100644 --- a/_i_repository_8cs.html +++ b/_i_repository_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_8cs_source.html b/_i_repository_8cs_source.html index e2dedb8cf5..336a5e15e9 100644 --- a/_i_repository_8cs_source.html +++ b/_i_repository_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_client_8cs.html b/_i_repository_client_8cs.html index b590d94427..b9822558c2 100644 --- a/_i_repository_client_8cs.html +++ b/_i_repository_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_client_8cs_source.html b/_i_repository_client_8cs_source.html index 14799e8b6d..1e5db90ff5 100644 --- a/_i_repository_client_8cs_source.html +++ b/_i_repository_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_manager_8cs.html b/_i_repository_manager_8cs.html index d5874ac55b..321ea47832 100644 --- a/_i_repository_manager_8cs.html +++ b/_i_repository_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_repository_manager_8cs_source.html b/_i_repository_manager_8cs_source.html index dad5dbe03a..0f91b24625 100644 --- a/_i_repository_manager_8cs_source.html +++ b/_i_repository_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_request_logger_8cs.html b/_i_request_logger_8cs.html index e278a24b14..68061d14f2 100644 --- a/_i_request_logger_8cs.html +++ b/_i_request_logger_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_request_logger_8cs_source.html b/_i_request_logger_8cs_source.html index c6da1097f9..04137a9fec 100644 --- a/_i_request_logger_8cs_source.html +++ b/_i_request_logger_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_restart_handler_8cs.html b/_i_restart_handler_8cs.html index 1d3fa55761..2436286051 100644 --- a/_i_restart_handler_8cs.html +++ b/_i_restart_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_restart_handler_8cs_source.html b/_i_restart_handler_8cs_source.html index 023a4b40a1..365911ee9f 100644 --- a/_i_restart_handler_8cs_source.html +++ b/_i_restart_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_restart_registration_8cs.html b/_i_restart_registration_8cs.html index 0f267cabb7..287b4c1764 100644 --- a/_i_restart_registration_8cs.html +++ b/_i_restart_registration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_restart_registration_8cs_source.html b/_i_restart_registration_8cs_source.html index 85de383c7e..15691b29e0 100644 --- a/_i_restart_registration_8cs_source.html +++ b/_i_restart_registration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_8cs.html b/_i_server_8cs.html index 313baa2579..b5e8cea7a7 100644 --- a/_i_server_8cs.html +++ b/_i_server_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_8cs_source.html b/_i_server_8cs_source.html index a1d7fbcae5..d3759f5cd0 100644 --- a/_i_server_8cs_source.html +++ b/_i_server_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_client_8cs.html b/_i_server_client_8cs.html index 6e5fb2c48e..61422595a4 100644 --- a/_i_server_client_8cs.html +++ b/_i_server_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_client_8cs_source.html b/_i_server_client_8cs_source.html index c1b635a7fa..e7a4b857c0 100644 --- a/_i_server_client_8cs_source.html +++ b/_i_server_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_client_factory_8cs.html b/_i_server_client_factory_8cs.html index 5b1c12ee61..2ee385f51f 100644 --- a/_i_server_client_factory_8cs.html +++ b/_i_server_client_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_client_factory_8cs_source.html b/_i_server_client_factory_8cs_source.html index 0ba976d132..c867de39ed 100644 --- a/_i_server_client_factory_8cs_source.html +++ b/_i_server_client_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_control_8cs.html b/_i_server_control_8cs.html index af57e46349..82767c5624 100644 --- a/_i_server_control_8cs.html +++ b/_i_server_control_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_control_8cs_source.html b/_i_server_control_8cs_source.html index edcceebb6b..a1506fde60 100644 --- a/_i_server_control_8cs_source.html +++ b/_i_server_control_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_factory_8cs.html b/_i_server_factory_8cs.html index f86cf7096b..f543ecb24c 100644 --- a/_i_server_factory_8cs.html +++ b/_i_server_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_factory_8cs_source.html b/_i_server_factory_8cs_source.html index 7b517792ca..f4e62be787 100644 --- a/_i_server_factory_8cs_source.html +++ b/_i_server_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_server_port_provider_8cs.html b/_i_server_port_provider_8cs.html index 847d4f0330..3d32f9023a 100644 --- a/_i_server_port_provider_8cs.html +++ b/_i_server_port_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_server_port_provider_8cs_source.html b/_i_server_port_provider_8cs_source.html index 3e6d353f8d..1d108c8234 100644 --- a/_i_server_port_provider_8cs_source.html +++ b/_i_server_port_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_session_controller_8cs.html b/_i_session_controller_8cs.html index 5fe7ba3308..e35aa284bc 100644 --- a/_i_session_controller_8cs.html +++ b/_i_session_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_session_controller_8cs_source.html b/_i_session_controller_8cs_source.html index e9517ac83e..7359faa8d1 100644 --- a/_i_session_controller_8cs_source.html +++ b/_i_session_controller_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_session_controller_factory_8cs.html b/_i_session_controller_factory_8cs.html index b8384d67ff..1b027cc789 100644 --- a/_i_session_controller_factory_8cs.html +++ b/_i_session_controller_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_session_controller_factory_8cs_source.html b/_i_session_controller_factory_8cs_source.html index e0713aafd7..b4a68f28f2 100644 --- a/_i_session_controller_factory_8cs_source.html +++ b/_i_session_controller_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_symlink_factory_8cs.html b/_i_symlink_factory_8cs.html index 4fc8ac8d51..a777365500 100644 --- a/_i_symlink_factory_8cs.html +++ b/_i_symlink_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_symlink_factory_8cs_source.html b/_i_symlink_factory_8cs_source.html index 1108a4e7a1..2ed5b8ca9e 100644 --- a/_i_symlink_factory_8cs_source.html +++ b/_i_symlink_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_synchronous_i_o_manager_8cs.html b/_i_synchronous_i_o_manager_8cs.html index 2160c737f4..751c6a1863 100644 --- a/_i_synchronous_i_o_manager_8cs.html +++ b/_i_synchronous_i_o_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_synchronous_i_o_manager_8cs_source.html b/_i_synchronous_i_o_manager_8cs_source.html index ccb9082730..8832400358 100644 --- a/_i_synchronous_i_o_manager_8cs_source.html +++ b/_i_synchronous_i_o_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_system_identity_8cs.html b/_i_system_identity_8cs.html index b4d835e6b3..2760bc5b80 100644 --- a/_i_system_identity_8cs.html +++ b/_i_system_identity_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_system_identity_8cs_source.html b/_i_system_identity_8cs_source.html index b54adf5782..7cdbf51ca3 100644 --- a/_i_system_identity_8cs_source.html +++ b/_i_system_identity_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_system_identity_factory_8cs.html b/_i_system_identity_factory_8cs.html index ab1eace42b..571a5e8850 100644 --- a/_i_system_identity_factory_8cs.html +++ b/_i_system_identity_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_system_identity_factory_8cs_source.html b/_i_system_identity_factory_8cs_source.html index 3ba4470281..e3ad47fac9 100644 --- a/_i_system_identity_factory_8cs_source.html +++ b/_i_system_identity_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_token_factory_8cs.html b/_i_token_factory_8cs.html index 0396c75f14..41f735d5ca 100644 --- a/_i_token_factory_8cs.html +++ b/_i_token_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_token_factory_8cs_source.html b/_i_token_factory_8cs_source.html index 612a94ef37..59892245bf 100644 --- a/_i_token_factory_8cs_source.html +++ b/_i_token_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_i_users_client_8cs.html b/_i_users_client_8cs.html index 9f5e5a76bb..42131b3387 100644 --- a/_i_users_client_8cs.html +++ b/_i_users_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_i_users_client_8cs_source.html b/_i_users_client_8cs_source.html index 6cef81f299..d2e521cc8f 100644 --- a/_i_users_client_8cs_source.html +++ b/_i_users_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_identity_cache_8cs.html b/_identity_cache_8cs.html index 9091ca00a3..5771036e67 100644 --- a/_identity_cache_8cs.html +++ b/_identity_cache_8cs.html @@ -25,7 +25,7 @@ diff --git a/_identity_cache_8cs_source.html b/_identity_cache_8cs_source.html index 701b35159c..9e75af4410 100644 --- a/_identity_cache_8cs_source.html +++ b/_identity_cache_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_identity_cache_object_8cs.html b/_identity_cache_object_8cs.html index a0bdf7cc90..398df21f13 100644 --- a/_identity_cache_object_8cs.html +++ b/_identity_cache_object_8cs.html @@ -25,7 +25,7 @@ diff --git a/_identity_cache_object_8cs_source.html b/_identity_cache_object_8cs_source.html index 2d085da752..263a7fc743 100644 --- a/_identity_cache_object_8cs_source.html +++ b/_identity_cache_object_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_client_8cs.html b/_instance_client_8cs.html index 89dcdfd087..3e40be8b0d 100644 --- a/_instance_client_8cs.html +++ b/_instance_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_client_8cs_source.html b/_instance_client_8cs_source.html index 3bb6af29f0..524142b251 100644 --- a/_instance_client_8cs_source.html +++ b/_instance_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_controller_8cs.html b/_instance_controller_8cs.html index 36a79fad19..8dd6144d8d 100644 --- a/_instance_controller_8cs.html +++ b/_instance_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_controller_8cs_source.html b/_instance_controller_8cs_source.html index 5a80dd6e3c..40390a97d2 100644 --- a/_instance_controller_8cs_source.html +++ b/_instance_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -122,17 +122,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ApiController for managing Components.Instances
readonly IIOManager ioManager
The IIOManager for the InstanceController
- +
Backend abstract implementation of IDatabaseContext
readonly IJobManager jobManager
The IJobManager for the InstanceController
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceController
async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Detach an Api.Models.Instance with the given id .
-
DbSet< ReattachInformation > ReattachInformations
The ReattachInformations in the DatabaseContext<TParentContext>.
+
DbSet< ReattachInformation > ReattachInformations
The ReattachInformations in the DatabaseContext<TParentContext>.
Routes to a server actions
Definition: Routes.cs:9
DreamDaemonRights
Rights for Models.DreamDaemon
const string CurrentDirectory
Path to the current working directory for the IIOManager.
- -
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
+ +
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
InstanceManagerRights
Rights for managing Models.Instances
async Task< IActionResult > Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
Modify an Api.Models.Instance&#39;s settings.
@@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
RepositoryRights
Rights for a Models.Repository
InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider, IPlatformIdentifier platformIdentifier, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< InstanceController > logger)
Construct a InstanceController
-
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the DatabaseContext<TParentContext>.
+
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the DatabaseContext<TParentContext>.
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
@@ -158,7 +158,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
IIOManager that resolves paths to Environment.CurrentDirectory
DreamDaemonSecurity
DreamDaemon&#39;s security level
-
DbSet< DualReattachInformation > WatchdogReattachInformations
The DualReattachInformations in the DatabaseContext<TParentContext>.
+
DbSet< DualReattachInformation > WatchdogReattachInformations
The DualReattachInformations in the DatabaseContext<TParentContext>.
const string List
The postfix for list operations
Definition: Routes.cs:84
Interface for using filesystems
Definition: IIOManager.cs:11
async Task< IActionResult > Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
Create or attach an Api.Models.Instance.
@@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Represents an error message returned by the server
Definition: ErrorMessage.cs:9
-
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext<TParentContext>.
+
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext<TParentContext>.
const ushort DefaultChatBotLimit
Default for Api.Models.Instance.ChatBotLimit.
Definition: Instance.cs:13
diff --git a/_instance_factory_8cs.html b/_instance_factory_8cs.html index 3fa15f092a..0dcda11dd8 100644 --- a/_instance_factory_8cs.html +++ b/_instance_factory_8cs.html @@ -25,7 +25,7 @@
diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html index f9e6fc82bc..3d18a4b9ab 100644 --- a/_instance_factory_8cs_source.html +++ b/_instance_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_8cs.html b/_instance_manager_8cs.html index cb73b9411d..e227786233 100644 --- a/_instance_manager_8cs.html +++ b/_instance_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_8cs_source.html b/_instance_manager_8cs_source.html index 8e03a680d0..a9c56a87ff 100644 --- a/_instance_manager_8cs_source.html +++ b/_instance_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_client_8cs.html b/_instance_manager_client_8cs.html index 5416d2f511..d9e09b6a50 100644 --- a/_instance_manager_client_8cs.html +++ b/_instance_manager_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_client_8cs_source.html b/_instance_manager_client_8cs_source.html index 16bbc9fe7b..acca6528b0 100644 --- a/_instance_manager_client_8cs_source.html +++ b/_instance_manager_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_rights_8cs.html b/_instance_manager_rights_8cs.html index ae98a45d4c..fbe26d4269 100644 --- a/_instance_manager_rights_8cs.html +++ b/_instance_manager_rights_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_manager_rights_8cs_source.html b/_instance_manager_rights_8cs_source.html index 2bd06296d3..cd0ff16e21 100644 --- a/_instance_manager_rights_8cs_source.html +++ b/_instance_manager_rights_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_user_client_8cs.html b/_instance_user_client_8cs.html index 193cf6c413..5d0d6431f4 100644 --- a/_instance_user_client_8cs.html +++ b/_instance_user_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_user_client_8cs_source.html b/_instance_user_client_8cs_source.html index 411bdec28b..f84c5d9d8a 100644 --- a/_instance_user_client_8cs_source.html +++ b/_instance_user_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_instance_user_controller_8cs.html b/_instance_user_controller_8cs.html index 063c81c4f9..c33fdf94ad 100644 --- a/_instance_user_controller_8cs.html +++ b/_instance_user_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_instance_user_controller_8cs_source.html b/_instance_user_controller_8cs_source.html index 913a8ce5c1..d816693382 100644 --- a/_instance_user_controller_8cs_source.html +++ b/_instance_user_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -112,20 +112,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
- +
Backend abstract implementation of IDatabaseContext
async Task< IActionResult > Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
Create am Api.Models.InstanceUser.
Routes to a server actions
Definition: Routes.cs:9
DreamDaemonRights
Rights for Models.DreamDaemon
- -
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
+ +
DbSet< Instance > Instances
The Instances in the DatabaseContext<TParentContext>.
DreamMakerRights
Rights for Models.DreamMaker
RepositoryRights
Rights for a Models.Repository
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
-
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the DatabaseContext<TParentContext>.
+
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the DatabaseContext<TParentContext>.
long Id
The ID of the User
Definition: User.cs:16
Metadata about a server instance
Definition: Instance.cs:9
diff --git a/_instance_user_rights_8cs.html b/_instance_user_rights_8cs.html index f47635e7c1..fe1c645fdb 100644 --- a/_instance_user_rights_8cs.html +++ b/_instance_user_rights_8cs.html @@ -25,7 +25,7 @@
diff --git a/_instance_user_rights_8cs_source.html b/_instance_user_rights_8cs_source.html index a7a371d20f..c4f5f5f572 100644 --- a/_instance_user_rights_8cs_source.html +++ b/_instance_user_rights_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_insufficient_permissions_exception_8cs.html b/_insufficient_permissions_exception_8cs.html index 2ab4f00664..36882b3e9b 100644 --- a/_insufficient_permissions_exception_8cs.html +++ b/_insufficient_permissions_exception_8cs.html @@ -25,7 +25,7 @@ diff --git a/_insufficient_permissions_exception_8cs_source.html b/_insufficient_permissions_exception_8cs_source.html index 217f7a2f65..56fb23d9db 100644 --- a/_insufficient_permissions_exception_8cs_source.html +++ b/_insufficient_permissions_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_internal_2_server_information_8cs.html b/_internal_2_server_information_8cs.html index 1a6dffdf82..f8a3697bc5 100644 --- a/_internal_2_server_information_8cs.html +++ b/_internal_2_server_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_internal_2_server_information_8cs_source.html b/_internal_2_server_information_8cs_source.html index 26f06f5700..15085fc51e 100644 --- a/_internal_2_server_information_8cs_source.html +++ b/_internal_2_server_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_irc_connection_string_builder_8cs.html b/_irc_connection_string_builder_8cs.html index d2de6fd349..ec46314506 100644 --- a/_irc_connection_string_builder_8cs.html +++ b/_irc_connection_string_builder_8cs.html @@ -25,7 +25,7 @@ diff --git a/_irc_connection_string_builder_8cs_source.html b/_irc_connection_string_builder_8cs_source.html index bf0e18d67f..a165d6b946 100644 --- a/_irc_connection_string_builder_8cs_source.html +++ b/_irc_connection_string_builder_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_irc_password_type_8cs.html b/_irc_password_type_8cs.html index fc8a4e6be9..b8a0edc7a8 100644 --- a/_irc_password_type_8cs.html +++ b/_irc_password_type_8cs.html @@ -25,7 +25,7 @@ diff --git a/_irc_password_type_8cs_source.html b/_irc_password_type_8cs_source.html index 2aed16962e..23865f65ae 100644 --- a/_irc_password_type_8cs_source.html +++ b/_irc_password_type_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_irc_provider_8cs.html b/_irc_provider_8cs.html index 11f922f725..f3555733c7 100644 --- a/_irc_provider_8cs.html +++ b/_irc_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_irc_provider_8cs_source.html b/_irc_provider_8cs_source.html index 0a14947616..9f9e276ece 100644 --- a/_irc_provider_8cs_source.html +++ b/_irc_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_job_controller_8cs.html b/_job_controller_8cs.html index bfac3f88dc..592b77bfd0 100644 --- a/_job_controller_8cs.html +++ b/_job_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_job_controller_8cs_source.html b/_job_controller_8cs_source.html index fdf8ffee1c..ee8d2b436a 100644 --- a/_job_controller_8cs_source.html +++ b/_job_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -102,10 +102,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger< JobController > logger)
Construct a HomeController
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
- -
DbSet< Job > Jobs
The Jobs in the DatabaseContext<TParentContext>.
+
Backend abstract implementation of IDatabaseContext
+
DbSet< Job > Jobs
The Jobs in the DatabaseContext<TParentContext>.
Routes to a server actions
Definition: Routes.cs:9
- +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific Api.Models.Job.
diff --git a/_job_exception_8cs.html b/_job_exception_8cs.html index 1b53ef221a..6bc9d240cc 100644 --- a/_job_exception_8cs.html +++ b/_job_exception_8cs.html @@ -25,7 +25,7 @@
diff --git a/_job_exception_8cs_source.html b/_job_exception_8cs_source.html index 88a0ee6440..4c7a903b93 100644 --- a/_job_exception_8cs_source.html +++ b/_job_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_job_handler_8cs.html b/_job_handler_8cs.html index 61fa21f92f..00848845ae 100644 --- a/_job_handler_8cs.html +++ b/_job_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_job_handler_8cs_source.html b/_job_handler_8cs_source.html index 4ce2f41009..1227811297 100644 --- a/_job_handler_8cs_source.html +++ b/_job_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_job_manager_8cs.html b/_job_manager_8cs.html index c8c65906e1..b60fed2464 100644 --- a/_job_manager_8cs.html +++ b/_job_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_job_manager_8cs_source.html b/_job_manager_8cs_source.html index 3c166b6df3..d938bb1158 100644 --- a/_job_manager_8cs_source.html +++ b/_job_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_jobs_client_8cs.html b/_jobs_client_8cs.html index f51b5ba952..e6ffb24f84 100644 --- a/_jobs_client_8cs.html +++ b/_jobs_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_jobs_client_8cs_source.html b/_jobs_client_8cs_source.html index f0980ff864..2965246760 100644 --- a/_jobs_client_8cs_source.html +++ b/_jobs_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_kek_command_8cs.html b/_kek_command_8cs.html index d97eac048a..6703343855 100644 --- a/_kek_command_8cs.html +++ b/_kek_command_8cs.html @@ -25,7 +25,7 @@ diff --git a/_kek_command_8cs_source.html b/_kek_command_8cs_source.html index b85793f636..2d5ce0bc16 100644 --- a/_kek_command_8cs_source.html +++ b/_kek_command_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_launch_result_8cs.html b/_launch_result_8cs.html index 3fefb33842..7a2d0e28fb 100644 --- a/_launch_result_8cs.html +++ b/_launch_result_8cs.html @@ -25,7 +25,7 @@ diff --git a/_launch_result_8cs_source.html b/_launch_result_8cs_source.html index 5136020ba0..59f323c785 100644 --- a/_launch_result_8cs_source.html +++ b/_launch_result_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_lib_git2_commands_8cs.html b/_lib_git2_commands_8cs.html index f2c257f374..50b50f88e4 100644 --- a/_lib_git2_commands_8cs.html +++ b/_lib_git2_commands_8cs.html @@ -25,7 +25,7 @@ diff --git a/_lib_git2_commands_8cs_source.html b/_lib_git2_commands_8cs_source.html index 5c174cf1d6..fb3728647f 100644 --- a/_lib_git2_commands_8cs_source.html +++ b/_lib_git2_commands_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_lib_git2_repository_factory_8cs.html b/_lib_git2_repository_factory_8cs.html index fc5dfbb559..425703c029 100644 --- a/_lib_git2_repository_factory_8cs.html +++ b/_lib_git2_repository_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_lib_git2_repository_factory_8cs_source.html b/_lib_git2_repository_factory_8cs_source.html index d7b32cb624..b55791315e 100644 --- a/_lib_git2_repository_factory_8cs_source.html +++ b/_lib_git2_repository_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_limits_8cs.html b/_limits_8cs.html index 46c44a98dd..00714c700b 100644 --- a/_limits_8cs.html +++ b/_limits_8cs.html @@ -25,7 +25,7 @@ diff --git a/_limits_8cs_source.html b/_limits_8cs_source.html index 19dd1aa4c6..4c798b69c2 100644 --- a/_limits_8cs_source.html +++ b/_limits_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_message_8cs.html b/_message_8cs.html index 4820701154..6fe79fc64f 100644 --- a/_message_8cs.html +++ b/_message_8cs.html @@ -25,7 +25,7 @@ diff --git a/_message_8cs_source.html b/_message_8cs_source.html index 1f5d9af499..c7a9e31b84 100644 --- a/_message_8cs_source.html +++ b/_message_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_method_not_supported_exception_8cs.html b/_method_not_supported_exception_8cs.html index f8a9e00126..76a047efb6 100644 --- a/_method_not_supported_exception_8cs.html +++ b/_method_not_supported_exception_8cs.html @@ -25,7 +25,7 @@ diff --git a/_method_not_supported_exception_8cs_source.html b/_method_not_supported_exception_8cs_source.html index 7b76216aaf..ec267e8445 100644 --- a/_method_not_supported_exception_8cs_source.html +++ b/_method_not_supported_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_models_2_dual_reattach_information_8cs.html b/_models_2_dual_reattach_information_8cs.html index 25be77328b..895703fb47 100644 --- a/_models_2_dual_reattach_information_8cs.html +++ b/_models_2_dual_reattach_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_models_2_dual_reattach_information_8cs_source.html b/_models_2_dual_reattach_information_8cs_source.html index 6f31a7bedc..ba8bd96f7d 100644 --- a/_models_2_dual_reattach_information_8cs_source.html +++ b/_models_2_dual_reattach_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_models_2_reattach_information_8cs.html b/_models_2_reattach_information_8cs.html index 564353dc3d..7b52b192a3 100644 --- a/_models_2_reattach_information_8cs.html +++ b/_models_2_reattach_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_models_2_reattach_information_8cs_source.html b/_models_2_reattach_information_8cs_source.html index 40fe2ed573..53f8118340 100644 --- a/_models_2_reattach_information_8cs_source.html +++ b/_models_2_reattach_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_monitor_action_8cs.html b/_monitor_action_8cs.html index 14dd47cea5..84773a5ead 100644 --- a/_monitor_action_8cs.html +++ b/_monitor_action_8cs.html @@ -25,7 +25,7 @@ diff --git a/_monitor_action_8cs_source.html b/_monitor_action_8cs_source.html index d3a11d494f..ce1c2c11df 100644 --- a/_monitor_action_8cs_source.html +++ b/_monitor_action_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_monitor_activation_reason_8cs.html b/_monitor_activation_reason_8cs.html index 13653fd4c4..1f69f315dc 100644 --- a/_monitor_activation_reason_8cs.html +++ b/_monitor_activation_reason_8cs.html @@ -25,7 +25,7 @@ diff --git a/_monitor_activation_reason_8cs_source.html b/_monitor_activation_reason_8cs_source.html index a01e5fd72e..6fb6baa4dd 100644 --- a/_monitor_activation_reason_8cs_source.html +++ b/_monitor_activation_reason_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_monitor_state_8cs.html b/_monitor_state_8cs.html index 5f3b34af7a..b6ebc3f052 100644 --- a/_monitor_state_8cs.html +++ b/_monitor_state_8cs.html @@ -25,7 +25,7 @@ diff --git a/_monitor_state_8cs_source.html b/_monitor_state_8cs_source.html index 76a39aaa26..63ad389153 100644 --- a/_monitor_state_8cs_source.html +++ b/_monitor_state_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_my_sql_database_context_8cs.html b/_my_sql_database_context_8cs.html index c6fc6732f6..37d192c54f 100644 --- a/_my_sql_database_context_8cs.html +++ b/_my_sql_database_context_8cs.html @@ -25,7 +25,7 @@ diff --git a/_my_sql_database_context_8cs_source.html b/_my_sql_database_context_8cs_source.html index 0c1508dfb4..3a3a57403d 100644 --- a/_my_sql_database_context_8cs_source.html +++ b/_my_sql_database_context_8cs_source.html @@ -25,7 +25,7 @@ @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
override void OnConfiguring(DbContextOptionsBuilder options)
For initially seeding a database
- +
Backend abstract implementation of IDatabaseContext
DatabaseContext<TParentContext> for MySQL
diff --git a/_my_sql_database_context_model_snapshot_8cs.html b/_my_sql_database_context_model_snapshot_8cs.html index 99df134dbf..e4423957ac 100644 --- a/_my_sql_database_context_model_snapshot_8cs.html +++ b/_my_sql_database_context_model_snapshot_8cs.html @@ -25,7 +25,7 @@
diff --git a/_my_sql_database_context_model_snapshot_8cs_source.html b/_my_sql_database_context_model_snapshot_8cs_source.html index c853929ba8..b2f7176752 100644 --- a/_my_sql_database_context_model_snapshot_8cs_source.html +++ b/_my_sql_database_context_model_snapshot_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_my_sql_design_time_db_context_factory_8cs.html b/_my_sql_design_time_db_context_factory_8cs.html index 023b15040e..82d5f29839 100644 --- a/_my_sql_design_time_db_context_factory_8cs.html +++ b/_my_sql_design_time_db_context_factory_8cs.html @@ -25,7 +25,7 @@ @@ -103,6 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +

diff --git a/_i_database_context_factory_8cs_source.html b/_i_database_context_factory_8cs_source.html index ff133e2e19..7b673b8f44 100644 --- a/_i_database_context_factory_8cs_source.html +++ b/_i_database_context_factory_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite

Classes

class  Tgstation.Server.Host.Database.Design.MySqlDesignTimeDbContextFactory
 IDesignTimeDbContextFactory<TContext> for creating MySqlDatabaseContexts. More...
 
@@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
MySqlDesignTimeDbContextFactory.cs
-Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
13  sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MySqlDatabaseContext>
14  {
16  public MySqlDatabaseContext CreateDbContext(string[] args)
17  {
18  using var loggerFactory = new LoggerFactory();
19  return new MySqlDatabaseContext(
20  new DbContextOptions<MySqlDatabaseContext>(),
22  DatabaseType.MariaDB,
23  "Server=127.0.0.1;User Id=root;Password=fake;Database=TGS_Design"),
24  new DatabaseSeeder(
26  new PasswordHasher<User>()),
27  new PlatformIdentifier()),
28  loggerFactory.CreateLogger<MySqlDatabaseContext>());
29  }
30  }
31 }
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
15  sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MySqlDatabaseContext>
16  {
18  public MySqlDatabaseContext CreateDbContext(string[] args)
19  {
20  using var loggerFactory = new LoggerFactory();
21  return new MySqlDatabaseContext(
22  new DbContextOptions<MySqlDatabaseContext>(),
24  DatabaseType.MariaDB,
25  "Server=127.0.0.1;User Id=root;Password=fake;Database=TGS_Design"),
26  new DatabaseSeeder(
28  new PasswordHasher<User>()),
29  new PlatformIdentifier()),
30  loggerFactory.CreateLogger<MySqlDatabaseContext>());
31  }
32  }
33 }
static IOptions< DatabaseConfiguration > GetDbContextOptions(DatabaseType databaseType, string connectionString)
Get the IOptions<TOptions> for the DatabaseConfiguration
@@ -103,12 +103,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
DatabaseContext<TParentContext> for MySQL
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
Contains helpers for creating design time DatabaseContext<TParentContext>s
- +
IDesignTimeDbContextFactory<TContext> for creating MySqlDatabaseContexts.
diff --git a/_native_methods_8cs.html b/_native_methods_8cs.html index b50fa36c66..945c24c5b3 100644 --- a/_native_methods_8cs.html +++ b/_native_methods_8cs.html @@ -25,7 +25,7 @@
diff --git a/_native_methods_8cs_source.html b/_native_methods_8cs_source.html index 0a458b0058..84030bd892 100644 --- a/_native_methods_8cs_source.html +++ b/_native_methods_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_open_api_enum_var_names_extension_8cs.html b/_open_api_enum_var_names_extension_8cs.html index c331c186d0..e401a4152d 100644 --- a/_open_api_enum_var_names_extension_8cs.html +++ b/_open_api_enum_var_names_extension_8cs.html @@ -25,7 +25,7 @@ diff --git a/_open_api_enum_var_names_extension_8cs_source.html b/_open_api_enum_var_names_extension_8cs_source.html index c8b4272b72..d25c5f630b 100644 --- a/_open_api_enum_var_names_extension_8cs_source.html +++ b/_open_api_enum_var_names_extension_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_platform_identifier_8cs.html b/_platform_identifier_8cs.html index a405712b17..6814143817 100644 --- a/_platform_identifier_8cs.html +++ b/_platform_identifier_8cs.html @@ -25,7 +25,7 @@ diff --git a/_platform_identifier_8cs_source.html b/_platform_identifier_8cs_source.html index 70039ae718..080a0d1720 100644 --- a/_platform_identifier_8cs_source.html +++ b/_platform_identifier_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_byond_installer_8cs.html b/_posix_byond_installer_8cs.html index ea341d18b4..25efa87b7b 100644 --- a/_posix_byond_installer_8cs.html +++ b/_posix_byond_installer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_byond_installer_8cs_source.html b/_posix_byond_installer_8cs_source.html index 585adc529c..cf820912b1 100644 --- a/_posix_byond_installer_8cs_source.html +++ b/_posix_byond_installer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_network_prompt_reaper_8cs.html b/_posix_network_prompt_reaper_8cs.html index 89304080a5..36207d293c 100644 --- a/_posix_network_prompt_reaper_8cs.html +++ b/_posix_network_prompt_reaper_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_network_prompt_reaper_8cs_source.html b/_posix_network_prompt_reaper_8cs_source.html index e19992de84..29a44a1d20 100644 --- a/_posix_network_prompt_reaper_8cs_source.html +++ b/_posix_network_prompt_reaper_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_post_write_handler_8cs.html b/_posix_post_write_handler_8cs.html index 4deded95a3..77e60c40f5 100644 --- a/_posix_post_write_handler_8cs.html +++ b/_posix_post_write_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_post_write_handler_8cs_source.html b/_posix_post_write_handler_8cs_source.html index d06653f4ae..311701d8bb 100644 --- a/_posix_post_write_handler_8cs_source.html +++ b/_posix_post_write_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_process_features_8cs.html b/_posix_process_features_8cs.html index 3164c1b013..1602f5dede 100644 --- a/_posix_process_features_8cs.html +++ b/_posix_process_features_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_process_features_8cs_source.html b/_posix_process_features_8cs_source.html index fddbc6243b..fce9237f52 100644 --- a/_posix_process_features_8cs_source.html +++ b/_posix_process_features_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_symlink_factory_8cs.html b/_posix_symlink_factory_8cs.html index 2637731824..040277bf8e 100644 --- a/_posix_symlink_factory_8cs.html +++ b/_posix_symlink_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_symlink_factory_8cs_source.html b/_posix_symlink_factory_8cs_source.html index 42732a296a..286856d7d0 100644 --- a/_posix_symlink_factory_8cs_source.html +++ b/_posix_symlink_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_system_identity_8cs.html b/_posix_system_identity_8cs.html index 9e30eaa077..562f45355a 100644 --- a/_posix_system_identity_8cs.html +++ b/_posix_system_identity_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_system_identity_8cs_source.html b/_posix_system_identity_8cs_source.html index f8646a4331..95874c2ff1 100644 --- a/_posix_system_identity_8cs_source.html +++ b/_posix_system_identity_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_posix_system_identity_factory_8cs.html b/_posix_system_identity_factory_8cs.html index 92208b0c23..43ce882407 100644 --- a/_posix_system_identity_factory_8cs.html +++ b/_posix_system_identity_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_posix_system_identity_factory_8cs_source.html b/_posix_system_identity_factory_8cs_source.html index fbc1414175..671b0224c4 100644 --- a/_posix_system_identity_factory_8cs_source.html +++ b/_posix_system_identity_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_post_setup_services_8cs.html b/_post_setup_services_8cs.html index 9fbcaf8a38..c4e639a4f9 100644 --- a/_post_setup_services_8cs.html +++ b/_post_setup_services_8cs.html @@ -25,7 +25,7 @@ diff --git a/_post_setup_services_8cs_source.html b/_post_setup_services_8cs_source.html index 08c5d6791e..81a8e9a6af 100644 --- a/_post_setup_services_8cs_source.html +++ b/_post_setup_services_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_process_8cs.html b/_process_8cs.html index 23859af298..c5024f3f28 100644 --- a/_process_8cs.html +++ b/_process_8cs.html @@ -25,7 +25,7 @@ diff --git a/_process_8cs_source.html b/_process_8cs_source.html index 8bccced0f9..1c9ddef29d 100644 --- a/_process_8cs_source.html +++ b/_process_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_process_executor_8cs.html b/_process_executor_8cs.html index 363b8a76d6..e7a7ecc0e6 100644 --- a/_process_executor_8cs.html +++ b/_process_executor_8cs.html @@ -25,7 +25,7 @@ diff --git a/_process_executor_8cs_source.html b/_process_executor_8cs_source.html index 7ccfd73e89..480e75b853 100644 --- a/_process_executor_8cs_source.html +++ b/_process_executor_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_program_8cs.html b/_program_8cs.html new file mode 100644 index 0000000000..565a5c8060 --- /dev/null +++ b/_program_8cs.html @@ -0,0 +1,122 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Program.cs File Reference + + + + + + + + + + +
+
+

diff --git a/_my_sql_design_time_db_context_factory_8cs_source.html b/_my_sql_design_time_db_context_factory_8cs_source.html index 89455e3e2a..c8b75992a0 100644 --- a/_my_sql_design_time_db_context_factory_8cs_source.html +++ b/_my_sql_design_time_db_context_factory_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
+ + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+ +
+
Program.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Program
 Entrypoint for the Process More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_program_8cs_source.html b/_program_8cs_source.html new file mode 100644 index 0000000000..1b06724499 --- /dev/null +++ b/_program_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Program.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Program.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
9 
10 namespace Tgstation.Server.Host
11 {
15  static class Program
16  {
17 #pragma warning disable SA1401 // Fields must be private
18  internal static readonly Version HostWatchdogVersion = new Version(1, 1, 0);
22 
27 #pragma warning restore SA1401 // Fields must be private
28 
34  public static async Task<int> Main(string[] args)
35  {
36  // first arg is 100% always the update path, starting it otherwise is solely for debugging purposes
37  var listArgs = new List<string>(args);
38  string updatePath = null;
39  if (listArgs.Count > 0)
40  {
41  updatePath = listArgs.First();
42  listArgs.RemoveAt(0);
43 
44  // second arg should be host watchdog version
45  if (listArgs.Count > 0
46  && Version.TryParse(listArgs.First(), out var hostWatchdogVersion)
47  && hostWatchdogVersion.Major != HostWatchdogVersion.Major)
48  throw new InvalidOperationException(
49  $"Incompatible host watchdog version ({hostWatchdogVersion}) for server ({HostWatchdogVersion})! A major update was released and a full restart will be required. Please manually offline your servers!");
50 
51  if (listArgs.Remove("--attach-debugger"))
52  Debugger.Launch();
53  }
54 
55  var updatedArgsArray = listArgs.ToArray();
56  try
57  {
58  using var shutdownNotifier = new ProgramShutdownTokenSource();
59  var cancellationToken = shutdownNotifier.Token;
60  IServer server;
61  try
62  {
63  server = await ServerFactory.CreateServer(updatedArgsArray, updatePath, cancellationToken).ConfigureAwait(false);
64  }
65  catch (OperationCanceledException)
66  {
67  // Console cancelled
68  return 0;
69  }
70 
71  if (server == null)
72  return 0;
73 
74  try
75  {
76  await server.Run(cancellationToken).ConfigureAwait(false);
77  }
78  catch (OperationCanceledException) { }
79  return server.RestartRequested ? 1 : 0;
80  }
81  catch (Exception e)
82  {
83  if (updatePath != null)
84  {
85  await ServerFactory.IOManager.WriteAllBytes(updatePath, Encoding.UTF8.GetBytes(e.ToString()), default).ConfigureAwait(false);
86  return 2;
87  }
88 
89  // If you hit an exception debug break on this line it caused the application to crash
90  throw;
91  }
92  }
93  }
94 }
IIOManager IOManager
The IIOManager for the IServerFactory.
+ +
bool RestartRequested
If the IServer should restart
Definition: IServer.cs:14
+ +
Task< IServer > CreateServer(string[] args, string updatePath, CancellationToken cancellationToken)
Create a IServer
+ + +
Entrypoint for the Process
Definition: Program.cs:15
+
Sets up dependency injection.
Definition: Application.cs:47
+
Implementation of IServerFactory.
+
Contains a CancellationToken that triggers when the operating system requests the program shuts down...
+ +
Represents the host
Definition: IServer.cs:9
+
Task Run(CancellationToken cancellationToken)
Runs the IServer
+
static IServerFactory CreateDefaultServerFactory()
Create the default IServerFactory.
+
static async Task< int > Main(string[] args)
Entrypoint for the Program
Definition: Program.cs:34
+ + + +
+ + + + diff --git a/_program_shutdown_token_source_8cs.html b/_program_shutdown_token_source_8cs.html index c63db28e1b..409f1f55be 100644 --- a/_program_shutdown_token_source_8cs.html +++ b/_program_shutdown_token_source_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_program_shutdown_token_source_8cs_source.html b/_program_shutdown_token_source_8cs_source.html index f53c8df2ce..68b717b6bb 100644 --- a/_program_shutdown_token_source_8cs_source.html +++ b/_program_shutdown_token_source_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_provider_8cs.html b/_provider_8cs.html index 5131d05c31..304363b2ee 100644 --- a/_provider_8cs.html +++ b/_provider_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_provider_8cs_source.html b/_provider_8cs_source.html index 3817ad944e..4ae07f3fb8 100644 --- a/_provider_8cs_source.html +++ b/_provider_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_provider_factory_8cs.html b/_provider_factory_8cs.html index 12ec8490d4..02135c1936 100644 --- a/_provider_factory_8cs.html +++ b/_provider_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_provider_factory_8cs_source.html b/_provider_factory_8cs_source.html index 7475d349aa..436813aeff 100644 --- a/_provider_factory_8cs_source.html +++ b/_provider_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_pull_requests_command_8cs.html b/_pull_requests_command_8cs.html index 177c212a24..33f7813e19 100644 --- a/_pull_requests_command_8cs.html +++ b/_pull_requests_command_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_pull_requests_command_8cs_source.html b/_pull_requests_command_8cs_source.html index c125f3fc83..60c54eb741 100644 --- a/_pull_requests_command_8cs_source.html +++ b/_pull_requests_command_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_r_e_a_d_m_e_8md.html b/_r_e_a_d_m_e_8md.html index 3237f3df8f..91797bc6a6 100644 --- a/_r_e_a_d_m_e_8md.html +++ b/_r_e_a_d_m_e_8md.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_r_e_a_d_m_e_8md_source.html b/_r_e_a_d_m_e_8md_source.html index d1253b331a..3c120c9c0d 100644 --- a/_r_e_a_d_m_e_8md_source.html +++ b/_r_e_a_d_m_e_8md_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rate_limit_exception_8cs.html b/_rate_limit_exception_8cs.html index 3c9ffb0602..3f15f0bf8c 100644 --- a/_rate_limit_exception_8cs.html +++ b/_rate_limit_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rate_limit_exception_8cs_source.html b/_rate_limit_exception_8cs_source.html index c3db7b1f63..7702a8687f 100644 --- a/_rate_limit_exception_8cs_source.html +++ b/_rate_limit_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reattach_info_handler_8cs.html b/_reattach_info_handler_8cs.html index 74c8c00a8d..d04a197b77 100644 --- a/_reattach_info_handler_8cs.html +++ b/_reattach_info_handler_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reattach_info_handler_8cs_source.html b/_reattach_info_handler_8cs_source.html index 850cbef3a9..00428abc28 100644 --- a/_reattach_info_handler_8cs_source.html +++ b/_reattach_info_handler_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reattach_information_base_8cs.html b/_reattach_information_base_8cs.html index 2cf99d7567..7e24d98b9d 100644 --- a/_reattach_information_base_8cs.html +++ b/_reattach_information_base_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reattach_information_base_8cs_source.html b/_reattach_information_base_8cs_source.html index 911fb7d63e..6f412f4b5f 100644 --- a/_reattach_information_base_8cs_source.html +++ b/_reattach_information_base_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reboot_state_8cs.html b/_reboot_state_8cs.html index 13c7f72d47..49ec30cbfd 100644 --- a/_reboot_state_8cs.html +++ b/_reboot_state_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_reboot_state_8cs_source.html b/_reboot_state_8cs_source.html index 2e0bba0ce1..29a8d97806 100644 --- a/_reboot_state_8cs_source.html +++ b/_reboot_state_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_client_8cs.html b/_repository_client_8cs.html index ebf7b1286d..20f629d4c1 100644 --- a/_repository_client_8cs.html +++ b/_repository_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_client_8cs_source.html b/_repository_client_8cs_source.html index 30ee6fbedb..5171e9c6d6 100644 --- a/_repository_client_8cs_source.html +++ b/_repository_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_controller_8cs.html b/_repository_controller_8cs.html index 66f6cb0d57..9f6df180ad 100644 --- a/_repository_controller_8cs.html +++ b/_repository_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_controller_8cs_source.html b/_repository_controller_8cs_source.html index 166e93cc43..c9a8b43abf 100644 --- a/_repository_controller_8cs_source.html +++ b/_repository_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
string GitHubOwner
If the repository was cloned from GitHub.com this will be set with the owner of the repository ...
Definition: Repository.cs:28
Use server authentication
-
DbSet< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the DatabaseContext<TParentContext>.
+
DbSet< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the DatabaseContext<TParentContext>.
Definition: ChatBot.cs:5
User may list files
@@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
async Task< bool > PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
For creating IGitHubClients
-
+
Backend abstract implementation of IDatabaseContext
User may list and read all Models.CompileJobs
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
Definition: Application.cs:41
@@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
async Task< bool > LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)
ApiController for managing the Repositorys
async Task< IActionResult > Create([FromBody] Repository model, CancellationToken cancellationToken)
Begin cloning the repository if it doesn&#39;t exist.
-
Represents the database
+
Represents the database.
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:9
Represents a git repository
Definition: Repository.cs:8
diff --git a/_repository_manager_8cs.html b/_repository_manager_8cs.html index 5618ce74b3..69912b61a3 100644 --- a/_repository_manager_8cs.html +++ b/_repository_manager_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_manager_8cs_source.html b/_repository_manager_8cs_source.html index 823f5e1043..eac8feb294 100644 --- a/_repository_manager_8cs_source.html +++ b/_repository_manager_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_rights_8cs.html b/_repository_rights_8cs.html index ffcdc74c3c..1c05dd2d4b 100644 --- a/_repository_rights_8cs.html +++ b/_repository_rights_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_repository_rights_8cs_source.html b/_repository_rights_8cs_source.html index b5b85a327b..f5014fcd5e 100644 --- a/_repository_rights_8cs_source.html +++ b/_repository_rights_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_request_timeout_exception_8cs.html b/_request_timeout_exception_8cs.html index 43a4af71fb..ce028d72b8 100644 --- a/_request_timeout_exception_8cs.html +++ b/_request_timeout_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_request_timeout_exception_8cs_source.html b/_request_timeout_exception_8cs_source.html index ba0b91a3db..a41c6d8e58 100644 --- a/_request_timeout_exception_8cs_source.html +++ b/_request_timeout_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_resolving_i_o_manager_8cs.html b/_resolving_i_o_manager_8cs.html index 0ea65e51b1..e57ac9fc4f 100644 --- a/_resolving_i_o_manager_8cs.html +++ b/_resolving_i_o_manager_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_resolving_i_o_manager_8cs_source.html b/_resolving_i_o_manager_8cs_source.html index d86aeaedb7..d6f4f82597 100644 --- a/_resolving_i_o_manager_8cs_source.html +++ b/_resolving_i_o_manager_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_restart_registration_8cs.html b/_restart_registration_8cs.html index f07469cec2..11243634d0 100644 --- a/_restart_registration_8cs.html +++ b/_restart_registration_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_restart_registration_8cs_source.html b/_restart_registration_8cs_source.html index 79dd54a5fc..994f457edf 100644 --- a/_restart_registration_8cs_source.html +++ b/_restart_registration_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rev_info_test_merge_8cs.html b/_rev_info_test_merge_8cs.html index c141b96d50..ea57bed961 100644 --- a/_rev_info_test_merge_8cs.html +++ b/_rev_info_test_merge_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rev_info_test_merge_8cs_source.html b/_rev_info_test_merge_8cs_source.html index e0ca7d135a..5f42a233aa 100644 --- a/_rev_info_test_merge_8cs_source.html +++ b/_rev_info_test_merge_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_revision_command_8cs.html b/_revision_command_8cs.html index f88eeb961b..347a0e0ad8 100644 --- a/_revision_command_8cs.html +++ b/_revision_command_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_revision_command_8cs_source.html b/_revision_command_8cs_source.html index 18f72807b6..8c8b42b3b0 100644 --- a/_revision_command_8cs_source.html +++ b/_revision_command_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rights_helper_8cs.html b/_rights_helper_8cs.html index 7e5df06824..0918fef7b7 100644 --- a/_rights_helper_8cs.html +++ b/_rights_helper_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rights_helper_8cs_source.html b/_rights_helper_8cs_source.html index ec171544bd..ba39e2b3e7 100644 --- a/_rights_helper_8cs_source.html +++ b/_rights_helper_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rights_type_8cs.html b/_rights_type_8cs.html index 98ac3f01e7..ee75cc608c 100644 --- a/_rights_type_8cs.html +++ b/_rights_type_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_rights_type_8cs_source.html b/_rights_type_8cs_source.html index ffb9563de8..c2ddc36513 100644 --- a/_rights_type_8cs_source.html +++ b/_rights_type_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_routes_8cs.html b/_routes_8cs.html index 06bb0a57a9..cf10d69c48 100644 --- a/_routes_8cs.html +++ b/_routes_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_routes_8cs_source.html b/_routes_8cs_source.html index 00cbed4ae6..9f105bd7a2 100644 --- a/_routes_8cs_source.html +++ b/_routes_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_runtime_information_8cs.html b/_runtime_information_8cs.html index 4fc6019d3a..f4628c87e7 100644 --- a/_runtime_information_8cs.html +++ b/_runtime_information_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_runtime_information_8cs_source.html b/_runtime_information_8cs_source.html index 26cba968c2..ab52c1e412 100644 --- a/_runtime_information_8cs_source.html +++ b/_runtime_information_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_semaphore_slim_context_8cs.html b/_semaphore_slim_context_8cs.html index e941990f49..fb32580a61 100644 --- a/_semaphore_slim_context_8cs.html +++ b/_semaphore_slim_context_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_semaphore_slim_context_8cs_source.html b/_semaphore_slim_context_8cs_source.html index 35818f43c6..09ef1def38 100644 --- a/_semaphore_slim_context_8cs_source.html +++ b/_semaphore_slim_context_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_8cs.html b/_server_8cs.html index 615bc8051f..46102da1c2 100644 --- a/_server_8cs.html +++ b/_server_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_8cs_source.html b/_server_8cs_source.html index db4a8948fa..a60d7c250c 100644 --- a/_server_8cs_source.html +++ b/_server_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_client_8cs.html b/_server_client_8cs.html index 067c8b4090..0e4139cc36 100644 --- a/_server_client_8cs.html +++ b/_server_client_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_client_8cs_source.html b/_server_client_8cs_source.html index 6f7ae8b097..3af17abdb5 100644 --- a/_server_client_8cs_source.html +++ b/_server_client_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_client_factory_8cs.html b/_server_client_factory_8cs.html index 50d49e2b23..4133724c7c 100644 --- a/_server_client_factory_8cs.html +++ b/_server_client_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_client_factory_8cs_source.html b/_server_client_factory_8cs_source.html index f9ff620e05..20b278d9cb 100644 --- a/_server_client_factory_8cs_source.html +++ b/_server_client_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_error_exception_8cs.html b/_server_error_exception_8cs.html index a1db3cee7e..1946dde987 100644 --- a/_server_error_exception_8cs.html +++ b/_server_error_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_error_exception_8cs_source.html b/_server_error_exception_8cs_source.html index e4fdd07226..c1544b6d43 100644 --- a/_server_error_exception_8cs_source.html +++ b/_server_error_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_factory_8cs.html b/_server_factory_8cs.html index 3d49eebb22..6459c68ed4 100644 --- a/_server_factory_8cs.html +++ b/_server_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_factory_8cs_source.html b/_server_factory_8cs_source.html index bdf1fefc0d..6bfa5bd881 100644 --- a/_server_factory_8cs_source.html +++ b/_server_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_information_8cs.html b/_server_information_8cs.html index 4783a5798a..94acf1bacd 100644 --- a/_server_information_8cs.html +++ b/_server_information_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_information_8cs_source.html b/_server_information_8cs_source.html index 291d86eaac..d274a63c6b 100644 --- a/_server_information_8cs_source.html +++ b/_server_information_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_port_proivder_8cs.html b/_server_port_proivder_8cs.html index 09d6c6c247..ee714581ed 100644 --- a/_server_port_proivder_8cs.html +++ b/_server_port_proivder_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_port_proivder_8cs_source.html b/_server_port_proivder_8cs_source.html index 4fcaecafb5..5ab68fa247 100644 --- a/_server_port_proivder_8cs_source.html +++ b/_server_port_proivder_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_service_8cs.html b/_server_service_8cs.html index 2a5f8911dc..3770da42d5 100644 --- a/_server_service_8cs.html +++ b/_server_service_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_service_8cs_source.html b/_server_service_8cs_source.html index 51677a9b34..d03542da68 100644 --- a/_server_service_8cs_source.html +++ b/_server_service_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_side_modifications_8cs.html b/_server_side_modifications_8cs.html index abeb0d49d8..8feed4851c 100644 --- a/_server_side_modifications_8cs.html +++ b/_server_side_modifications_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_server_side_modifications_8cs_source.html b/_server_side_modifications_8cs_source.html index 083811a924..058896f437 100644 --- a/_server_side_modifications_8cs_source.html +++ b/_server_side_modifications_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_service_2_program_8cs.html b/_service_2_program_8cs.html new file mode 100644 index 0000000000..abce4cdf8a --- /dev/null +++ b/_service_2_program_8cs.html @@ -0,0 +1,122 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Program.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Program.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Service.Program
 Contains the entrypoint for the application More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Service
 
+
+ + + + diff --git a/_service_2_program_8cs_source.html b/_service_2_program_8cs_source.html new file mode 100644 index 0000000000..65693b2a8b --- /dev/null +++ b/_service_2_program_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Program.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +  4.2.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Program.cs
+
+
+Go to the documentation of this file.
1 using McMaster.Extensions.CommandLineUtils;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Collections.Specialized;
5 using System.Configuration.Install;
6 using System.Diagnostics;
7 using System.Globalization;
8 using System.Linq;
9 using System.Reflection;
10 using System.Security.Principal;
11 using System.ServiceProcess;
12 using System.Threading.Tasks;
13 using System.Windows.Forms;
15 
16 namespace Tgstation.Server.Host.Service
17 {
21  sealed class Program
22  {
23 #pragma warning disable SA1401 // Fields should be private
24  internal static IWatchdogFactory WatchdogFactory = new WatchdogFactory();
28 #pragma warning restore SA1401 // Fields should be private
29 
33  [Option(ShortName = "u")]
34  public bool Uninstall { get; }
35 
39  [Option(ShortName = "i")]
40  public bool Install { get; set; }
41 
45  [Option(ShortName = "c")]
46  public bool Configure { get; set; }
47 
51  [Option(ShortName = "t")]
52  public bool Trace { get; set; }
53 
57  [Option(ShortName = "d")]
58  public bool Debug { get; set; }
59 
64  static bool IsAdministrator()
65  {
66  var user = WindowsIdentity.GetCurrent();
67  var principal = new WindowsPrincipal(user);
68  return principal.IsInRole(WindowsBuiltInRole.Administrator);
69  }
70 
74  static Task<int> Main(string[] args) => CommandLineApplication.ExecuteAsync<Program>(args);
75 
80  public async Task OnExecuteAsync()
81  {
82  if (Environment.UserInteractive)
83  {
84  if (!Install && !Uninstall && !Configure)
85  {
86  var result = MessageBox.Show("You are running the TGS windows service executable directly. It should only be run by the service control manager. Would you like to install and configure the service in this location?", "TGS Service", MessageBoxButtons.YesNo);
87  if (result != DialogResult.Yes)
88  return;
89  Install = true;
90  Configure = true;
91  }
92 
93  if (!IsAdministrator())
94  {
95  // try to restart as admin
96  // its windows, first arg is .exe name guaranteed
97  var exe = Environment.GetCommandLineArgs().First();
98  var startInfo = new ProcessStartInfo
99  {
100  UseShellExecute = true,
101  Verb = "runas",
102  Arguments = String.Format(CultureInfo.InvariantCulture, "{0} {1}", Install ? "-i" : Uninstall ? "-u" : String.Empty, Configure ? "-c" : String.Empty),
103  FileName = exe,
104  WorkingDirectory = Environment.CurrentDirectory,
105  };
106  using (Process.Start(startInfo))
107  return;
108  }
109  }
110 
111  using (var loggerFactory = new LoggerFactory())
112  {
113  if (Install)
114  {
115  if (Uninstall)
116  return; // oh no, it's retarded...
117  using (var processInstaller = new ServiceProcessInstaller())
118  using (var installer = new ServiceInstaller())
119  {
120  processInstaller.Account = ServiceAccount.LocalSystem;
121 
122  installer.Context = new InstallContext("tgs-4-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
123  installer.Description = "/tg/station 13 server v4 running as a windows service";
124  installer.DisplayName = "/tg/station server 4";
125  installer.DelayedAutoStart = true;
126  installer.StartType = ServiceStartMode.Automatic;
127  installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
128  installer.ServiceName = ServerService.Name;
129  installer.Parent = processInstaller;
130 
131  var state = new ListDictionary();
132  installer.Install(state);
133  }
134 
135  if (Configure)
136  {
137  Console.WriteLine("For this first run we'll launch the console runner so you may use the setup wizard.");
138  Console.WriteLine("If it starts successfully, feel free to close it and then start the service from the Windows control panel.");
139  }
140  }
141  else if (Uninstall)
142  using (var installer = new ServiceInstaller())
143  {
144  installer.Context = new InstallContext("tgs-4-uninstall.log", null);
145  installer.ServiceName = ServerService.Name;
146  installer.Uninstall(null);
147  }
148  else if (!Configure)
149  using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information))
150  ServiceBase.Run(service);
151 
152  if (Configure)
153  await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default).ConfigureAwait(false);
154  }
155  }
156  }
157 }
async Task OnExecuteAsync()
Command line handler, always runs
Definition: Program.cs:80
+
static bool IsAdministrator()
Check if the running user is a system administrator
Definition: Program.cs:64
+ + + + +
Contains the entrypoint for the application
Definition: Program.cs:21
+
const string Name
The canonical windows service name
+
Represents a IWatchdog as a ServiceBase
+ + + + + +
+ + + + diff --git a/_service_collection_extensions_8cs.html b/_service_collection_extensions_8cs.html index 181d8d48c4..f0b6c1db9c 100644 --- a/_service_collection_extensions_8cs.html +++ b/_service_collection_extensions_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_service_collection_extensions_8cs_source.html b/_service_collection_extensions_8cs_source.html index 4541a73db8..73ab9e20bf 100644 --- a/_service_collection_extensions_8cs_source.html +++ b/_service_collection_extensions_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_service_unavailable_exception_8cs.html b/_service_unavailable_exception_8cs.html index 9efaf8ae5b..b9743ae31b 100644 --- a/_service_unavailable_exception_8cs.html +++ b/_service_unavailable_exception_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_service_unavailable_exception_8cs_source.html b/_service_unavailable_exception_8cs_source.html index c5cf449ff7..5a4f72a55d 100644 --- a/_service_unavailable_exception_8cs_source.html +++ b/_service_unavailable_exception_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_session_controller_8cs.html b/_session_controller_8cs.html index 9ba4d4a61f..6eb3bea460 100644 --- a/_session_controller_8cs.html +++ b/_session_controller_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_session_controller_8cs_source.html b/_session_controller_8cs_source.html index e7821c240f..ee8919564d 100644 --- a/_session_controller_8cs_source.html +++ b/_session_controller_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_session_controller_factory_8cs.html b/_session_controller_factory_8cs.html index b03726a639..bb106e8a91 100644 --- a/_session_controller_factory_8cs.html +++ b/_session_controller_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_session_controller_factory_8cs_source.html b/_session_controller_factory_8cs_source.html index 34350eae3b..97cb5fa8e6 100644 --- a/_session_controller_factory_8cs_source.html +++ b/_session_controller_factory_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_setup_application_8cs.html b/_setup_application_8cs.html index 26a3577090..916b062d4f 100644 --- a/_setup_application_8cs.html +++ b/_setup_application_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_setup_application_8cs_source.html b/_setup_application_8cs_source.html index dceb53d9f3..c5d55af883 100644 --- a/_setup_application_8cs_source.html +++ b/_setup_application_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_setup_wizard_8cs.html b/_setup_wizard_8cs.html index 20e2d186f3..5a1d0ffa58 100644 --- a/_setup_wizard_8cs.html +++ b/_setup_wizard_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_setup_wizard_8cs_source.html b/_setup_wizard_8cs_source.html index 6eaa1568af..35960d89f4 100644 --- a/_setup_wizard_8cs_source.html +++ b/_setup_wizard_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -94,9 +94,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
SetupWizard.cs
-Go to the documentation of this file.
1 using Microsoft.Data.Sqlite;
2 using Microsoft.Extensions.Hosting;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using MySql.Data.MySqlClient;
6 using Newtonsoft.Json;
7 using System;
8 using System.Collections.Generic;
9 using System.Data.Common;
10 using System.Data.SqlClient;
11 using System.Globalization;
12 using System.IO;
13 using System.Linq;
14 using System.Text;
15 using System.Text.RegularExpressions;
16 using System.Threading;
17 using System.Threading.Tasks;
21 using Tgstation.Server.Host.IO;
23 
24 namespace Tgstation.Server.Host.Setup
25 {
27  sealed class SetupWizard : IHostedService
28  {
33 
37  readonly IConsole console;
38 
42  readonly IHostEnvironment hostingEnvironment;
43 
48 
53 
58 
63 
68 
73 
86  public SetupWizard(
87  IIOManager ioManager,
88  IConsole console,
89  IHostEnvironment hostingEnvironment,
90  IAssemblyInformationProvider assemblyInformationProvider,
91  IDatabaseConnectionFactory dbConnectionFactory,
92  IPlatformIdentifier platformIdentifier,
93  IAsyncDelayer asyncDelayer,
94  IHostApplicationLifetime applicationLifetime,
95  IOptions<GeneralConfiguration> generalConfigurationOptions)
96  {
97  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
98  this.console = console ?? throw new ArgumentNullException(nameof(console));
99  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
100  this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
101  this.dbConnectionFactory = dbConnectionFactory ?? throw new ArgumentNullException(nameof(dbConnectionFactory));
102  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
103  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
104  this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
105  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
106  }
107 
114  async Task<bool> PromptYesNo(string question, CancellationToken cancellationToken)
115  {
116  do
117  {
118  await console.WriteAsync(question, false, cancellationToken).ConfigureAwait(false);
119  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
120  var upperResponse = responseString.ToUpperInvariant();
121  if (upperResponse == "Y" || upperResponse == "YES")
122  return true;
123  else if (upperResponse == "N" || upperResponse == "NO")
124  return false;
125  await console.WriteAsync("Invalid response!", true, cancellationToken).ConfigureAwait(false);
126  }
127  while (true);
128  }
129 
135  async Task<ushort?> PromptForHostingPort(CancellationToken cancellationToken)
136  {
137  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
138  await console.WriteAsync("What port would you like to connect to TGS on?", true, cancellationToken).ConfigureAwait(false);
139  await console.WriteAsync("Note: If this is a docker container with the default port already mapped, use the default.", true, cancellationToken).ConfigureAwait(false);
140 
141  do
142  {
143  await console.WriteAsync("API Port (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
144  var portString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
145  if (String.IsNullOrWhiteSpace(portString))
146  return null;
147  if (UInt16.TryParse(portString, out var port) && port != 0)
148  return port;
149  await console.WriteAsync("Invalid port! Please enter a value between 1 and 65535", true, cancellationToken).ConfigureAwait(false);
150  }
151  while (true);
152  }
153 
164  DbConnection testConnection,
165  DatabaseConfiguration databaseConfiguration,
166  string databaseName,
167  bool dbExists,
168  CancellationToken cancellationToken)
169  {
170  bool isSqliteDB = databaseConfiguration.DatabaseType == DatabaseType.Sqlite;
171  using (testConnection)
172  {
173  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
174  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
175  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
176 
177  if (databaseConfiguration.DatabaseType == DatabaseType.MariaDB
178  || databaseConfiguration.DatabaseType == DatabaseType.MySql)
179  {
180  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
181  using var command = testConnection.CreateCommand();
182  command.CommandText = "SELECT VERSION()";
183  var fullVersion = (string)await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
184  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
185  var splits = fullVersion.Split('-');
186  databaseConfiguration.MySqlServerVersion = splits.First();
187  }
188 
189  if (!isSqliteDB && !dbExists)
190  {
191  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
192  using (var command = testConnection.CreateCommand())
193  {
194  // I really don't care about user sanitization here, they want to fuck their own DB? so be it
195 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
196  command.CommandText = $"CREATE DATABASE {databaseName}";
197 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
198  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
199  }
200 
201  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
202  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
203  using (var command = testConnection.CreateCommand())
204  {
205 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
206  command.CommandText = $"DROP DATABASE {databaseName}";
207 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
208  try
209  {
210  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
211  }
212  catch (OperationCanceledException)
213  {
214  throw;
215  }
216  catch (Exception e)
217  {
218  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
219  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
220  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
221  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
222  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
223  }
224  }
225  }
226  }
227 
228  if (isSqliteDB && !dbExists)
229  await Task.WhenAll(
230  console.WriteAsync("Deleting test database file...", true, cancellationToken),
231  ioManager.DeleteFile(databaseName, cancellationToken)).ConfigureAwait(false);
232  }
233 
234  async Task<string> ValidateNonExistantSqliteDBName(string databaseName, CancellationToken cancellationToken)
235  {
236  var resolvedPath = ioManager.ResolvePath(databaseName);
237  try
238  {
239  var directoryName = ioManager.GetDirectoryName(resolvedPath);
240  bool directoryExisted = await ioManager.DirectoryExists(directoryName, cancellationToken).ConfigureAwait(false);
241  await ioManager.CreateDirectory(directoryName, cancellationToken).ConfigureAwait(false);
242  try
243  {
244  await ioManager.WriteAllBytes(resolvedPath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
245  }
246  catch
247  {
248  if (!directoryExisted)
249  await ioManager.DeleteDirectory(directoryName, cancellationToken).ConfigureAwait(false);
250  throw;
251  }
252  }
253  catch (IOException)
254  {
255  return null;
256  }
257 
258  if (!Path.IsPathRooted(databaseName))
259  {
260  await console.WriteAsync("Note, this relative path (currently) resolves to the following:", true, cancellationToken).ConfigureAwait(false);
261  await console.WriteAsync(resolvedPath, true, cancellationToken).ConfigureAwait(false);
262  bool writeResolved = await PromptYesNo(
263  "Would you like to save the relative path in the configuration? If not, the full path will be saved. (y/n): ",
264  cancellationToken)
265  .ConfigureAwait(false);
266 
267  if (writeResolved)
268  databaseName = resolvedPath;
269  }
270 
271  await ioManager.DeleteFile(databaseName, cancellationToken).ConfigureAwait(false);
272  return databaseName;
273  }
274 
280  async Task<DatabaseType> PromptDatabaseType(CancellationToken cancellationToken)
281  {
282  await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false);
283  await console.WriteAsync(
284  "NOTE: It is HIGHLY reccommended that TGS runs on a complete relational database, specfically *NOT* Sqlite.",
285  true,
286  cancellationToken)
287  .ConfigureAwait(false);
288  await console.WriteAsync(
289  "Sqlite, by nature cannot perform several DDL operations. Because of this future compatiblility cannot be guaranteed.",
290  true,
291  cancellationToken)
292  .ConfigureAwait(false);
293  await console.WriteAsync(
294  "This means that you may not be able to update to the next minor version of TGS4 without a clean re-installation!",
295  true,
296  cancellationToken)
297  .ConfigureAwait(false);
298  await console.WriteAsync(
299  "Please consider taking the time to set up a relational database if this is meant to be a long-standing server.",
300  true,
301  cancellationToken)
302  .ConfigureAwait(false);
303  await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false);
304 
305  await asyncDelayer.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false);
306 
307  await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken).ConfigureAwait(false);
308  do
309  {
310  await console.WriteAsync(
311  String.Format(
312  CultureInfo.InvariantCulture,
313  "Please enter one of {0}, {1}, {2} or {3}: ",
314  DatabaseType.MariaDB,
315  DatabaseType.MySql,
316  DatabaseType.SqlServer,
317  DatabaseType.Sqlite),
318  false,
319  cancellationToken)
320  .ConfigureAwait(false);
321  var databaseTypeString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
322  if (Enum.TryParse<DatabaseType>(databaseTypeString, out var databaseType))
323  return databaseType;
324 
325  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
326  }
327  while (true);
328  }
329 
335  async Task<DatabaseConfiguration> ConfigureDatabase(CancellationToken cancellationToken)
336  {
337  do
338  {
339  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
340 
341  var databaseConfiguration = new DatabaseConfiguration
342  {
343  DatabaseType = await PromptDatabaseType(cancellationToken).ConfigureAwait(false)
344  };
345 
346  string serverAddress = null;
347  uint? mySQLServerPort = null;
348 
349  bool isSqliteDB = databaseConfiguration.DatabaseType == DatabaseType.Sqlite;
350  if (!isSqliteDB)
351  do
352  {
353  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
354  await console.WriteAsync("Enter the server's address and port [<server>:<port> or <server>] (blank for local): ", false, cancellationToken).ConfigureAwait(false);
355  serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
356  if (!String.IsNullOrWhiteSpace(serverAddress) && databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
357  {
358  var match = Regex.Match(serverAddress, @"^(?<server>.+):(?<port>.+)$");
359  if (match.Success)
360  {
361  serverAddress = match.Groups["server"].Value;
362  var portString = match.Groups["port"].Value;
363  if (uint.TryParse(portString, out uint port))
364  mySQLServerPort = port;
365  else
366  {
367  await console.WriteAsync($"Failed to parse port \"{portString}\", please try again.", true, cancellationToken).ConfigureAwait(false);
368  continue;
369  }
370  }
371  }
372 
373  break;
374  }
375  while (true);
376 
377  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
378  await console.WriteAsync($"Enter the database {(isSqliteDB ? "file path" : "name")} (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
379 
380  string databaseName;
381  bool dbExists = false;
382  do
383  {
384  databaseName = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
385  if (!String.IsNullOrWhiteSpace(databaseName))
386  {
387  if (isSqliteDB)
388  {
389  dbExists = await ioManager.FileExists(databaseName, cancellationToken).ConfigureAwait(false);
390  if (!dbExists)
391  databaseName = await ValidateNonExistantSqliteDBName(databaseName, cancellationToken).ConfigureAwait(false);
392  }
393  else
394  dbExists = await PromptYesNo("Does this database already exist? If not, we will attempt to CREATE it. (y/n): ", cancellationToken).ConfigureAwait(false);
395  }
396 
397  if (String.IsNullOrWhiteSpace(databaseName))
398  await console.WriteAsync("Invalid database name!", true, cancellationToken).ConfigureAwait(false);
399  else
400  break;
401  }
402  while (true);
403 
404  bool useWinAuth;
405  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer && platformIdentifier.IsWindows)
406  useWinAuth = await PromptYesNo("Use Windows Authentication? (y/n): ", cancellationToken).ConfigureAwait(false);
407  else
408  useWinAuth = false;
409 
410  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
411 
412  string username = null;
413  string password = null;
414  if (!isSqliteDB)
415  if (!useWinAuth)
416  {
417  await console.WriteAsync("Enter username: ", false, cancellationToken).ConfigureAwait(false);
418  username = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
419  await console.WriteAsync("Enter password: ", false, cancellationToken).ConfigureAwait(false);
420  password = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
421  }
422  else
423  {
424  await console.WriteAsync("IMPORTANT: If using the service runner, ensure this computer's LocalSystem account has CREATE DATABASE permissions on the target server!", true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync("The account it uses in MSSQL is usually \"NT AUTHORITY\\SYSTEM\" and the role it needs is usually \"dbcreator\".", true, cancellationToken).ConfigureAwait(false);
426  await console.WriteAsync("We'll run a sanity test here, but it won't be indicative of the service's permissions if that is the case", true, cancellationToken).ConfigureAwait(false);
427  }
428 
429  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
430 
431  DbConnection testConnection;
432  void CreateTestConnection(string connectionString) =>
433  testConnection = dbConnectionFactory.CreateConnection(
434  connectionString,
435  databaseConfiguration.DatabaseType);
436 
437  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
438  {
439  var csb = new SqlConnectionStringBuilder
440  {
441  ApplicationName = assemblyInformationProvider.VersionPrefix,
442  DataSource = serverAddress ?? "(local)"
443  };
444 
445  if (useWinAuth)
446  csb.IntegratedSecurity = true;
447  else
448  {
449  csb.UserID = username;
450  csb.Password = password;
451  }
452 
453  CreateTestConnection(csb.ConnectionString);
454  csb.InitialCatalog = databaseName;
455  databaseConfiguration.ConnectionString = csb.ConnectionString;
456  }
457  else if(databaseConfiguration.DatabaseType == DatabaseType.Sqlite)
458  {
459  var csb = new SqliteConnectionStringBuilder
460  {
461  DataSource = databaseName,
462  Mode = dbExists ? SqliteOpenMode.ReadOnly : SqliteOpenMode.ReadWriteCreate
463  };
464 
465  CreateTestConnection(csb.ConnectionString);
466  databaseConfiguration.ConnectionString = csb.ConnectionString;
467  }
468  else
469  {
470  // MySQL/MariaDB
471  var csb = new MySqlConnectionStringBuilder
472  {
473  Server = serverAddress ?? "127.0.0.1",
474  UserID = username,
475  Password = password
476  };
477 
478  if (mySQLServerPort.HasValue)
479  csb.Port = mySQLServerPort.Value;
480 
481  CreateTestConnection(csb.ConnectionString);
482  csb.Database = databaseName;
483  databaseConfiguration.ConnectionString = csb.ConnectionString;
484  }
485 
486  try
487  {
488  await TestDatabaseConnection(testConnection, databaseConfiguration, databaseName, dbExists, cancellationToken).ConfigureAwait(false);
489 
490  return databaseConfiguration;
491  }
492  catch (OperationCanceledException)
493  {
494  throw;
495  }
496  catch (Exception e)
497  {
498  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
499  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
500  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
501  }
502  }
503  while (true);
504  }
505 
511  async Task<GeneralConfiguration> ConfigureGeneral(CancellationToken cancellationToken)
512  {
513  var newGeneralConfiguration = new GeneralConfiguration
514  {
516  };
517 
518  do
519  {
520  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
521  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
522  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
523  if (String.IsNullOrWhiteSpace(passwordLengthString))
524  break;
525  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
526  {
527  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
528  break;
529  }
530 
531  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
532  }
533  while (true);
534 
535  do
536  {
537  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
538  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Timeout for sending and receiving BYOND topics (ms, 0 for infinite, leave blank for default of {0}): ", newGeneralConfiguration.ByondTopicTimeout), false, cancellationToken).ConfigureAwait(false);
539  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
540  if (String.IsNullOrWhiteSpace(topicTimeoutString))
541  break;
542  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
543  {
544  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
545  break;
546  }
547 
548  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
549  }
550  while (true);
551 
552  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
553  await console.WriteAsync("Enter a GitHub personal access token to bypass some rate limits (this is optional and does not require any scopes)", true, cancellationToken).ConfigureAwait(false);
554  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
555  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
556  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
557  newGeneralConfiguration.GitHubAccessToken = null;
558 
559  newGeneralConfiguration.UseExperimentalWatchdog = await PromptYesNo("Use the experimental watchdog (NOT RECOMMENDED)? (y/n): ", cancellationToken).ConfigureAwait(false);
560 
561  newGeneralConfiguration.UseBasicWatchdogOnWindows = true;
562 
563  return newGeneralConfiguration;
564  }
565 
571  async Task<FileLoggingConfiguration> ConfigureLogging(CancellationToken cancellationToken)
572  {
573  var fileLoggingConfiguration = new FileLoggingConfiguration();
574  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
575  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
576 
577  if (!fileLoggingConfiguration.Disable)
578  {
579  do
580  {
581  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
582  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
583  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
584  {
585  fileLoggingConfiguration.Directory = null;
586  break;
587  }
588 
589  // test a write of it
590  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
591  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
592  try
593  {
594  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
595  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
596  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
597  try
598  {
599  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
600  }
601  catch (OperationCanceledException)
602  {
603  throw;
604  }
605  catch (Exception e)
606  {
607  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
608  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
609  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
610  }
611 
612  break;
613  }
614  catch (OperationCanceledException)
615  {
616  throw;
617  }
618  catch (Exception e)
619  {
620  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
621  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
622  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
623  }
624  }
625  while (true);
626 
627  async Task<LogLevel?> PromptLogLevel(string question)
628  {
629  do
630  {
631  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
632  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
633  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Enter one of {0}/{1}/{2}/{3}/{4}/{5} (leave blank for default): ", nameof(LogLevel.Trace), nameof(LogLevel.Debug), nameof(LogLevel.Information), nameof(LogLevel.Warning), nameof(LogLevel.Error), nameof(LogLevel.Critical)), false, cancellationToken).ConfigureAwait(false);
634  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
635  if (String.IsNullOrWhiteSpace(responseString))
636  return null;
637  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
638  return logLevel;
639  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
640  }
641  while (true);
642  }
643 
644  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
645  fileLoggingConfiguration.MicrosoftLogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for Microsoft logs (VERY verbose, default {0}).", fileLoggingConfiguration.MicrosoftLogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.MicrosoftLogLevel;
646  }
647 
648  return fileLoggingConfiguration;
649  }
650 
656  async Task<ControlPanelConfiguration> ConfigureControlPanel(CancellationToken cancellationToken)
657  {
658  var config = new ControlPanelConfiguration
659  {
660  Enable = await PromptYesNo("Enable the web control panel (Incomplete)? (y/n): ", cancellationToken).ConfigureAwait(false),
661  AllowAnyOrigin = await PromptYesNo("Allow web control panels hosted elsewhere to access the server? (Access-Control-Allow-Origin: *) (y/n): ", cancellationToken).ConfigureAwait(false)
662  };
663 
664  if (!config.AllowAnyOrigin)
665  {
666  await console.WriteAsync("Enter a comma seperated list of CORS allowed origins (optional): ", false, cancellationToken).ConfigureAwait(false);
667  var commaSeperatedOrigins = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
668  if (!String.IsNullOrWhiteSpace(commaSeperatedOrigins))
669  {
670  var splits = commaSeperatedOrigins.Split(',');
671  config.AllowedOrigins = new List<string>(splits.Select(x => x.Trim()));
672  }
673  }
674 
675  return config;
676  }
677 
689  async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
690  {
691  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
692 
693  var map = new Dictionary<string, object>()
694  {
695  { DatabaseConfiguration.Section, databaseConfiguration },
696  { GeneralConfiguration.Section, newGeneralConfiguration },
697  { FileLoggingConfiguration.Section, fileLoggingConfiguration },
698  { ControlPanelConfiguration.Section, controlPanelConfiguration }
699  };
700 
701  if (hostingPort.HasValue)
702  map.Add("Kestrel", new
703  {
704  EndPoints = new
705  {
706  Http = new
707  {
708  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
709  }
710  }
711  });
712 
713  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
714  var configBytes = Encoding.UTF8.GetBytes(json);
715 
716  try
717  {
718  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
719  }
720  catch (OperationCanceledException)
721  {
722  throw;
723  }
724  catch (Exception e)
725  {
726  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
727  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
728  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
729  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
730  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
731  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
732  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
733  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
734  throw new OperationCanceledException();
735  }
736  }
737 
744  async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
745  {
746  // welcome message
747  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
748  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
749 
750  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
751 
752  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
753 
754  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
755 
756  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
757 
758  var controlPanelConfiguration = await ConfigureControlPanel(cancellationToken).ConfigureAwait(false);
759 
760  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
761 
762  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, controlPanelConfiguration, cancellationToken).ConfigureAwait(false);
763  }
764 
770  async Task CheckRunWizard(CancellationToken cancellationToken)
771  {
772  var setupWizardMode = generalConfiguration.SetupWizardMode;
773  if (setupWizardMode == SetupWizardMode.Never)
774  return;
775 
776  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
777  if (!console.Available)
778  {
779  if (forceRun)
780  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
781  return;
782  }
783 
784  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
785 
786  async Task HandleSetupCancel()
787  {
788  await console.WriteAsync(String.Empty, true, default).ConfigureAwait(false);
789  await console.WriteAsync("Aborting setup!", true, default).ConfigureAwait(false);
790  }
791 
792  // Link passed cancellationToken with cancel key press
793  Task finalTask = Task.CompletedTask;
794  using (var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, console.CancelKeyPress))
795  using ((cancellationToken = cts.Token).Register(() => finalTask = HandleSetupCancel()))
796  try
797  {
798  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
799 
800  bool shouldRunBasedOnAutodetect;
801  if (exists)
802  {
803  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
804  var contents = Encoding.UTF8.GetString(bytes);
805  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents) || contents.Trim() == "{}";
806  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
807  }
808  else
809  shouldRunBasedOnAutodetect = true;
810 
811  if (!shouldRunBasedOnAutodetect)
812  {
813  if (forceRun)
814  {
815  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "The configuration settings are requesting the setup wizard be run, but you already appear to have a configuration file ({0})!", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
816 
817  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
818  }
819 
820  if (!forceRun)
821  return;
822  }
823 
824  // flush the logs to prevent console conflicts
825  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
826 
827  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
828  }
829  finally
830  {
831  await finalTask.ConfigureAwait(false);
832  }
833  }
834 
836  public async Task StartAsync(CancellationToken cancellationToken)
837  {
838  await CheckRunWizard(cancellationToken).ConfigureAwait(false);
839  applicationLifetime.StopApplication();
840  }
841 
843  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
844  }
845 }
+Go to the documentation of this file.
1 using Microsoft.Data.Sqlite;
2 using Microsoft.Extensions.Hosting;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using MySql.Data.MySqlClient;
6 using Newtonsoft.Json;
7 using System;
8 using System.Collections.Generic;
9 using System.Data.Common;
10 using System.Data.SqlClient;
11 using System.Globalization;
12 using System.IO;
13 using System.Linq;
14 using System.Text;
15 using System.Text.RegularExpressions;
16 using System.Threading;
17 using System.Threading.Tasks;
21 using Tgstation.Server.Host.IO;
23 
24 namespace Tgstation.Server.Host.Setup
25 {
27  sealed class SetupWizard : IHostedService
28  {
33 
37  readonly IConsole console;
38 
42  readonly IHostEnvironment hostingEnvironment;
43 
48 
53 
58 
63 
67  readonly IHostApplicationLifetime applicationLifetime;
68 
73 
86  public SetupWizard(
87  IIOManager ioManager,
88  IConsole console,
89  IHostEnvironment hostingEnvironment,
90  IAssemblyInformationProvider assemblyInformationProvider,
91  IDatabaseConnectionFactory dbConnectionFactory,
92  IPlatformIdentifier platformIdentifier,
93  IAsyncDelayer asyncDelayer,
94  IHostApplicationLifetime applicationLifetime,
95  IOptions<GeneralConfiguration> generalConfigurationOptions)
96  {
97  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
98  this.console = console ?? throw new ArgumentNullException(nameof(console));
99  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
100  this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
101  this.dbConnectionFactory = dbConnectionFactory ?? throw new ArgumentNullException(nameof(dbConnectionFactory));
102  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
103  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
104  this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
105  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
106  }
107 
114  async Task<bool> PromptYesNo(string question, CancellationToken cancellationToken)
115  {
116  do
117  {
118  await console.WriteAsync(question, false, cancellationToken).ConfigureAwait(false);
119  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
120  var upperResponse = responseString.ToUpperInvariant();
121  if (upperResponse == "Y" || upperResponse == "YES")
122  return true;
123  else if (upperResponse == "N" || upperResponse == "NO")
124  return false;
125  await console.WriteAsync("Invalid response!", true, cancellationToken).ConfigureAwait(false);
126  }
127  while (true);
128  }
129 
135  async Task<ushort?> PromptForHostingPort(CancellationToken cancellationToken)
136  {
137  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
138  await console.WriteAsync("What port would you like to connect to TGS on?", true, cancellationToken).ConfigureAwait(false);
139  await console.WriteAsync("Note: If this is a docker container with the default port already mapped, use the default.", true, cancellationToken).ConfigureAwait(false);
140 
141  do
142  {
143  await console.WriteAsync("API Port (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
144  var portString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
145  if (String.IsNullOrWhiteSpace(portString))
146  return null;
147  if (UInt16.TryParse(portString, out var port) && port != 0)
148  return port;
149  await console.WriteAsync("Invalid port! Please enter a value between 1 and 65535", true, cancellationToken).ConfigureAwait(false);
150  }
151  while (true);
152  }
153 
164  DbConnection testConnection,
165  DatabaseConfiguration databaseConfiguration,
166  string databaseName,
167  bool dbExists,
168  CancellationToken cancellationToken)
169  {
170  bool isSqliteDB = databaseConfiguration.DatabaseType == DatabaseType.Sqlite;
171  using (testConnection)
172  {
173  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
174  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
175  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
176 
177  if (databaseConfiguration.DatabaseType == DatabaseType.MariaDB
178  || databaseConfiguration.DatabaseType == DatabaseType.MySql)
179  {
180  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
181  using var command = testConnection.CreateCommand();
182  command.CommandText = "SELECT VERSION()";
183  var fullVersion = (string)await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
184  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
185  var splits = fullVersion.Split('-');
186  databaseConfiguration.MySqlServerVersion = splits.First();
187  }
188 
189  if (!isSqliteDB && !dbExists)
190  {
191  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
192  using (var command = testConnection.CreateCommand())
193  {
194  // I really don't care about user sanitization here, they want to fuck their own DB? so be it
195 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
196  command.CommandText = $"CREATE DATABASE {databaseName}";
197 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
198  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
199  }
200 
201  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
202  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
203  using (var command = testConnection.CreateCommand())
204  {
205 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
206  command.CommandText = $"DROP DATABASE {databaseName}";
207 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
208  try
209  {
210  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
211  }
212  catch (OperationCanceledException)
213  {
214  throw;
215  }
216  catch (Exception e)
217  {
218  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
219  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
220  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
221  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
222  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
223  }
224  }
225  }
226  }
227 
228  if (isSqliteDB && !dbExists)
229  await Task.WhenAll(
230  console.WriteAsync("Deleting test database file...", true, cancellationToken),
231  ioManager.DeleteFile(databaseName, cancellationToken)).ConfigureAwait(false);
232  }
233 
234  async Task<string> ValidateNonExistantSqliteDBName(string databaseName, CancellationToken cancellationToken)
235  {
236  var resolvedPath = ioManager.ResolvePath(databaseName);
237  try
238  {
239  var directoryName = ioManager.GetDirectoryName(resolvedPath);
240  bool directoryExisted = await ioManager.DirectoryExists(directoryName, cancellationToken).ConfigureAwait(false);
241  await ioManager.CreateDirectory(directoryName, cancellationToken).ConfigureAwait(false);
242  try
243  {
244  await ioManager.WriteAllBytes(resolvedPath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
245  }
246  catch
247  {
248  if (!directoryExisted)
249  await ioManager.DeleteDirectory(directoryName, cancellationToken).ConfigureAwait(false);
250  throw;
251  }
252  }
253  catch (IOException)
254  {
255  return null;
256  }
257 
258  if (!Path.IsPathRooted(databaseName))
259  {
260  await console.WriteAsync("Note, this relative path (currently) resolves to the following:", true, cancellationToken).ConfigureAwait(false);
261  await console.WriteAsync(resolvedPath, true, cancellationToken).ConfigureAwait(false);
262  bool writeResolved = await PromptYesNo(
263  "Would you like to save the relative path in the configuration? If not, the full path will be saved. (y/n): ",
264  cancellationToken)
265  .ConfigureAwait(false);
266 
267  if (writeResolved)
268  databaseName = resolvedPath;
269  }
270 
271  await ioManager.DeleteFile(databaseName, cancellationToken).ConfigureAwait(false);
272  return databaseName;
273  }
274 
280  async Task<DatabaseType> PromptDatabaseType(CancellationToken cancellationToken)
281  {
282  await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false);
283  await console.WriteAsync(
284  "NOTE: It is HIGHLY reccommended that TGS runs on a complete relational database, specfically *NOT* Sqlite.",
285  true,
286  cancellationToken)
287  .ConfigureAwait(false);
288  await console.WriteAsync(
289  "Sqlite, by nature cannot perform several DDL operations. Because of this future compatiblility cannot be guaranteed.",
290  true,
291  cancellationToken)
292  .ConfigureAwait(false);
293  await console.WriteAsync(
294  "This means that you may not be able to update to the next minor version of TGS4 without a clean re-installation!",
295  true,
296  cancellationToken)
297  .ConfigureAwait(false);
298  await console.WriteAsync(
299  "Please consider taking the time to set up a relational database if this is meant to be a long-standing server.",
300  true,
301  cancellationToken)
302  .ConfigureAwait(false);
303  await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false);
304 
305  await asyncDelayer.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false);
306 
307  await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken).ConfigureAwait(false);
308  do
309  {
310  await console.WriteAsync(
311  String.Format(
312  CultureInfo.InvariantCulture,
313  "Please enter one of {0}, {1}, {2} or {3}: ",
314  DatabaseType.MariaDB,
315  DatabaseType.MySql,
316  DatabaseType.SqlServer,
317  DatabaseType.Sqlite),
318  false,
319  cancellationToken)
320  .ConfigureAwait(false);
321  var databaseTypeString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
322  if (Enum.TryParse<DatabaseType>(databaseTypeString, out var databaseType))
323  return databaseType;
324 
325  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
326  }
327  while (true);
328  }
329 
335  async Task<DatabaseConfiguration> ConfigureDatabase(CancellationToken cancellationToken)
336  {
337  do
338  {
339  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
340 
341  var databaseConfiguration = new DatabaseConfiguration
342  {
343  DatabaseType = await PromptDatabaseType(cancellationToken).ConfigureAwait(false)
344  };
345 
346  string serverAddress = null;
347  uint? mySQLServerPort = null;
348 
349  bool isSqliteDB = databaseConfiguration.DatabaseType == DatabaseType.Sqlite;
350  if (!isSqliteDB)
351  do
352  {
353  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
354  await console.WriteAsync("Enter the server's address and port [<server>:<port> or <server>] (blank for local): ", false, cancellationToken).ConfigureAwait(false);
355  serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
356  if (!String.IsNullOrWhiteSpace(serverAddress) && databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
357  {
358  var match = Regex.Match(serverAddress, @"^(?<server>.+):(?<port>.+)$");
359  if (match.Success)
360  {
361  serverAddress = match.Groups["server"].Value;
362  var portString = match.Groups["port"].Value;
363  if (uint.TryParse(portString, out uint port))
364  mySQLServerPort = port;
365  else
366  {
367  await console.WriteAsync($"Failed to parse port \"{portString}\", please try again.", true, cancellationToken).ConfigureAwait(false);
368  continue;
369  }
370  }
371  }
372 
373  break;
374  }
375  while (true);
376 
377  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
378  await console.WriteAsync($"Enter the database {(isSqliteDB ? "file path" : "name")} (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
379 
380  string databaseName;
381  bool dbExists = false;
382  do
383  {
384  databaseName = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
385  if (!String.IsNullOrWhiteSpace(databaseName))
386  {
387  if (isSqliteDB)
388  {
389  dbExists = await ioManager.FileExists(databaseName, cancellationToken).ConfigureAwait(false);
390  if (!dbExists)
391  databaseName = await ValidateNonExistantSqliteDBName(databaseName, cancellationToken).ConfigureAwait(false);
392  }
393  else
394  dbExists = await PromptYesNo("Does this database already exist? If not, we will attempt to CREATE it. (y/n): ", cancellationToken).ConfigureAwait(false);
395  }
396 
397  if (String.IsNullOrWhiteSpace(databaseName))
398  await console.WriteAsync("Invalid database name!", true, cancellationToken).ConfigureAwait(false);
399  else
400  break;
401  }
402  while (true);
403 
404  bool useWinAuth;
405  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer && platformIdentifier.IsWindows)
406  useWinAuth = await PromptYesNo("Use Windows Authentication? (y/n): ", cancellationToken).ConfigureAwait(false);
407  else
408  useWinAuth = false;
409 
410  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
411 
412  string username = null;
413  string password = null;
414  if (!isSqliteDB)
415  if (!useWinAuth)
416  {
417  await console.WriteAsync("Enter username: ", false, cancellationToken).ConfigureAwait(false);
418  username = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
419  await console.WriteAsync("Enter password: ", false, cancellationToken).ConfigureAwait(false);
420  password = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
421  }
422  else
423  {
424  await console.WriteAsync("IMPORTANT: If using the service runner, ensure this computer's LocalSystem account has CREATE DATABASE permissions on the target server!", true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync("The account it uses in MSSQL is usually \"NT AUTHORITY\\SYSTEM\" and the role it needs is usually \"dbcreator\".", true, cancellationToken).ConfigureAwait(false);
426  await console.WriteAsync("We'll run a sanity test here, but it won't be indicative of the service's permissions if that is the case", true, cancellationToken).ConfigureAwait(false);
427  }
428 
429  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
430 
431  DbConnection testConnection;
432  void CreateTestConnection(string connectionString) =>
433  testConnection = dbConnectionFactory.CreateConnection(
434  connectionString,
435  databaseConfiguration.DatabaseType);
436 
437  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
438  {
439  var csb = new SqlConnectionStringBuilder
440  {
441  ApplicationName = assemblyInformationProvider.VersionPrefix,
442  DataSource = serverAddress ?? "(local)"
443  };
444 
445  if (useWinAuth)
446  csb.IntegratedSecurity = true;
447  else
448  {
449  csb.UserID = username;
450  csb.Password = password;
451  }
452 
453  CreateTestConnection(csb.ConnectionString);
454  csb.InitialCatalog = databaseName;
455  databaseConfiguration.ConnectionString = csb.ConnectionString;
456  }
457  else if(databaseConfiguration.DatabaseType == DatabaseType.Sqlite)
458  {
459  var csb = new SqliteConnectionStringBuilder
460  {
461  DataSource = databaseName,
462  Mode = dbExists ? SqliteOpenMode.ReadOnly : SqliteOpenMode.ReadWriteCreate
463  };
464 
465  CreateTestConnection(csb.ConnectionString);
466  databaseConfiguration.ConnectionString = csb.ConnectionString;
467  }
468  else
469  {
470  // MySQL/MariaDB
471  var csb = new MySqlConnectionStringBuilder
472  {
473  Server = serverAddress ?? "127.0.0.1",
474  UserID = username,
475  Password = password
476  };
477 
478  if (mySQLServerPort.HasValue)
479  csb.Port = mySQLServerPort.Value;
480 
481  CreateTestConnection(csb.ConnectionString);
482  csb.Database = databaseName;
483  databaseConfiguration.ConnectionString = csb.ConnectionString;
484  }
485 
486  try
487  {
488  await TestDatabaseConnection(testConnection, databaseConfiguration, databaseName, dbExists, cancellationToken).ConfigureAwait(false);
489 
490  return databaseConfiguration;
491  }
492  catch (OperationCanceledException)
493  {
494  throw;
495  }
496  catch (Exception e)
497  {
498  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
499  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
500  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
501  }
502  }
503  while (true);
504  }
505 
511  async Task<GeneralConfiguration> ConfigureGeneral(CancellationToken cancellationToken)
512  {
513  var newGeneralConfiguration = new GeneralConfiguration
514  {
516  };
517 
518  do
519  {
520  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
521  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
522  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
523  if (String.IsNullOrWhiteSpace(passwordLengthString))
524  break;
525  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
526  {
527  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
528  break;
529  }
530 
531  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
532  }
533  while (true);
534 
535  do
536  {
537  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
538  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Timeout for sending and receiving BYOND topics (ms, 0 for infinite, leave blank for default of {0}): ", newGeneralConfiguration.ByondTopicTimeout), false, cancellationToken).ConfigureAwait(false);
539  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
540  if (String.IsNullOrWhiteSpace(topicTimeoutString))
541  break;
542  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
543  {
544  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
545  break;
546  }
547 
548  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
549  }
550  while (true);
551 
552  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
553  await console.WriteAsync("Enter a GitHub personal access token to bypass some rate limits (this is optional and does not require any scopes)", true, cancellationToken).ConfigureAwait(false);
554  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
555  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
556  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
557  newGeneralConfiguration.GitHubAccessToken = null;
558 
559  newGeneralConfiguration.UseExperimentalWatchdog = await PromptYesNo("Use the experimental watchdog (NOT RECOMMENDED)? (y/n): ", cancellationToken).ConfigureAwait(false);
560 
561  newGeneralConfiguration.UseBasicWatchdogOnWindows = true;
562 
563  return newGeneralConfiguration;
564  }
565 
571  async Task<FileLoggingConfiguration> ConfigureLogging(CancellationToken cancellationToken)
572  {
573  var fileLoggingConfiguration = new FileLoggingConfiguration();
574  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
575  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
576 
577  if (!fileLoggingConfiguration.Disable)
578  {
579  do
580  {
581  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
582  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
583  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
584  {
585  fileLoggingConfiguration.Directory = null;
586  break;
587  }
588 
589  // test a write of it
590  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
591  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
592  try
593  {
594  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
595  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
596  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
597  try
598  {
599  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
600  }
601  catch (OperationCanceledException)
602  {
603  throw;
604  }
605  catch (Exception e)
606  {
607  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
608  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
609  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
610  }
611 
612  break;
613  }
614  catch (OperationCanceledException)
615  {
616  throw;
617  }
618  catch (Exception e)
619  {
620  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
621  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
622  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
623  }
624  }
625  while (true);
626 
627  async Task<LogLevel?> PromptLogLevel(string question)
628  {
629  do
630  {
631  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
632  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
633  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Enter one of {0}/{1}/{2}/{3}/{4}/{5} (leave blank for default): ", nameof(LogLevel.Trace), nameof(LogLevel.Debug), nameof(LogLevel.Information), nameof(LogLevel.Warning), nameof(LogLevel.Error), nameof(LogLevel.Critical)), false, cancellationToken).ConfigureAwait(false);
634  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
635  if (String.IsNullOrWhiteSpace(responseString))
636  return null;
637  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
638  return logLevel;
639  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
640  }
641  while (true);
642  }
643 
644  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
645  fileLoggingConfiguration.MicrosoftLogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for Microsoft logs (VERY verbose, default {0}).", fileLoggingConfiguration.MicrosoftLogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.MicrosoftLogLevel;
646  }
647 
648  return fileLoggingConfiguration;
649  }
650 
656  async Task<ControlPanelConfiguration> ConfigureControlPanel(CancellationToken cancellationToken)
657  {
658  var config = new ControlPanelConfiguration
659  {
660  Enable = await PromptYesNo("Enable the web control panel (Incomplete)? (y/n): ", cancellationToken).ConfigureAwait(false),
661  AllowAnyOrigin = await PromptYesNo("Allow web control panels hosted elsewhere to access the server? (Access-Control-Allow-Origin: *) (y/n): ", cancellationToken).ConfigureAwait(false)
662  };
663 
664  if (!config.AllowAnyOrigin)
665  {
666  await console.WriteAsync("Enter a comma seperated list of CORS allowed origins (optional): ", false, cancellationToken).ConfigureAwait(false);
667  var commaSeperatedOrigins = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
668  if (!String.IsNullOrWhiteSpace(commaSeperatedOrigins))
669  {
670  var splits = commaSeperatedOrigins.Split(',');
671  config.AllowedOrigins = new List<string>(splits.Select(x => x.Trim()));
672  }
673  }
674 
675  return config;
676  }
677 
689  async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
690  {
691  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
692 
693  var map = new Dictionary<string, object>()
694  {
695  { DatabaseConfiguration.Section, databaseConfiguration },
696  { GeneralConfiguration.Section, newGeneralConfiguration },
697  { FileLoggingConfiguration.Section, fileLoggingConfiguration },
698  { ControlPanelConfiguration.Section, controlPanelConfiguration }
699  };
700 
701  if (hostingPort.HasValue)
702  map.Add("Kestrel", new
703  {
704  EndPoints = new
705  {
706  Http = new
707  {
708  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
709  }
710  }
711  });
712 
713  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
714  var configBytes = Encoding.UTF8.GetBytes(json);
715 
716  try
717  {
718  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
719  }
720  catch (OperationCanceledException)
721  {
722  throw;
723  }
724  catch (Exception e)
725  {
726  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
727  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
728  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
729  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
730  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
731  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
732  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
733  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
734  throw new OperationCanceledException();
735  }
736  }
737 
744  async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
745  {
746  // welcome message
747  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
748  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
749 
750  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
751 
752  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
753 
754  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
755 
756  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
757 
758  var controlPanelConfiguration = await ConfigureControlPanel(cancellationToken).ConfigureAwait(false);
759 
760  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
761 
762  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, controlPanelConfiguration, cancellationToken).ConfigureAwait(false);
763  }
764 
770  async Task CheckRunWizard(CancellationToken cancellationToken)
771  {
772  var setupWizardMode = generalConfiguration.SetupWizardMode;
773  if (setupWizardMode == SetupWizardMode.Never)
774  return;
775 
776  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
777  if (!console.Available)
778  {
779  if (forceRun)
780  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
781  return;
782  }
783 
784  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
785 
786  async Task HandleSetupCancel()
787  {
788  await console.WriteAsync(String.Empty, true, default).ConfigureAwait(false);
789  await console.WriteAsync("Aborting setup!", true, default).ConfigureAwait(false);
790  }
791 
792  // Link passed cancellationToken with cancel key press
793  Task finalTask = Task.CompletedTask;
794  using (var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, console.CancelKeyPress))
795  using ((cancellationToken = cts.Token).Register(() => finalTask = HandleSetupCancel()))
796  try
797  {
798  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
799 
800  bool shouldRunBasedOnAutodetect;
801  if (exists)
802  {
803  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
804  var contents = Encoding.UTF8.GetString(bytes);
805  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents) || contents.Trim() == "{}";
806  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
807  }
808  else
809  shouldRunBasedOnAutodetect = true;
810 
811  if (!shouldRunBasedOnAutodetect)
812  {
813  if (forceRun)
814  {
815  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "The configuration settings are requesting the setup wizard be run, but you already appear to have a configuration file ({0})!", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
816 
817  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
818  }
819 
820  if (!forceRun)
821  return;
822  }
823 
824  // flush the logs to prevent console conflicts
825  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
826 
827  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
828  }
829  finally
830  {
831  await finalTask.ConfigureAwait(false);
832  }
833  }
834 
836  public async Task StartAsync(CancellationToken cancellationToken)
837  {
838  await CheckRunWizard(cancellationToken).ConfigureAwait(false);
839  applicationLifetime.StopApplication();
840  }
841 
843  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
844  }
845 }
List< string > AllowedOrigins
Origins allowed for CORS requests
-
async Task< DatabaseType > PromptDatabaseType(CancellationToken cancellationToken)
Prompt the user for the DatabaseType.
Definition: SetupWizard.cs:280
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the SetupWizard
Definition: SetupWizard.cs:62
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:32
diff --git a/_setup_wizard_mode_8cs.html b/_setup_wizard_mode_8cs.html index 6f5664507e..1bd3e80411 100644 --- a/_setup_wizard_mode_8cs.html +++ b/_setup_wizard_mode_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_setup_wizard_mode_8cs_source.html b/_setup_wizard_mode_8cs_source.html index 4de42c33c0..dc047eb9f6 100644 --- a/_setup_wizard_mode_8cs_source.html +++ b/_setup_wizard_mode_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_sql_server_database_context_8cs.html b/_sql_server_database_context_8cs.html index 4967ccf6ee..c90c622c8d 100644 --- a/_sql_server_database_context_8cs.html +++ b/_sql_server_database_context_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_sql_server_database_context_8cs_source.html b/_sql_server_database_context_8cs_source.html index 124c4895e9..80e9d1e1f3 100644 --- a/_sql_server_database_context_8cs_source.html +++ b/_sql_server_database_context_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
For initially seeding a database
- +
Backend abstract implementation of IDatabaseContext
override void OnConfiguring(DbContextOptionsBuilder options)
Configuration options for the Database.DatabaseContext<TParentContext>
diff --git a/_sql_server_database_context_model_snapshot_8cs.html b/_sql_server_database_context_model_snapshot_8cs.html index f39145820f..5fb6723045 100644 --- a/_sql_server_database_context_model_snapshot_8cs.html +++ b/_sql_server_database_context_model_snapshot_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_sql_server_database_context_model_snapshot_8cs_source.html b/_sql_server_database_context_model_snapshot_8cs_source.html index b86f855d28..e01601b2f6 100644 --- a/_sql_server_database_context_model_snapshot_8cs_source.html +++ b/_sql_server_database_context_model_snapshot_8cs_source.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/_sql_server_design_time_db_context_factory_8cs.html b/_sql_server_design_time_db_context_factory_8cs.html index 923cafafdd..a7fe8cff83 100644 --- a/_sql_server_design_time_db_context_factory_8cs.html +++ b/_sql_server_design_time_db_context_factory_8cs.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -103,6 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

Classes

class  Tgstation.Server.Host.Database.Design.SqlServerDesignTimeDbContextFactory + IDesignTimeDbContextFactory<TContext> for creating SqlServerDatabaseContexts. More...
  @@ -94,13 +94,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
SqlServerDesignTimeDbContextFactory.cs
-Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
13  sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqlServerDatabaseContext>
14  {
17  {
18  using var loggerFactory = new LoggerFactory();
19  return new SqlServerDatabaseContext(
20  new DbContextOptions<SqlServerDatabaseContext>(),
22  DatabaseType.SqlServer,
23  "Data Source=fake;Initial Catalog=TGS_Design;Integrated Security=True;Application Name=tgstation-server"),
24  new DatabaseSeeder(
26  new PasswordHasher<User>()),
27  new PlatformIdentifier()),
28  loggerFactory.CreateLogger<SqlServerDatabaseContext>());
29  }
30  }
31 }
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
15  sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqlServerDatabaseContext>
16  {
19  {
20  using var loggerFactory = new LoggerFactory();
21  return new SqlServerDatabaseContext(
22  new DbContextOptions<SqlServerDatabaseContext>(),
24  DatabaseType.SqlServer,
25  "Data Source=fake;Initial Catalog=TGS_Design;Integrated Security=True;Application Name=tgstation-server"),
26  new DatabaseSeeder(
28  new PasswordHasher<User>()),
29  new PlatformIdentifier()),
30  loggerFactory.CreateLogger<SqlServerDatabaseContext>());
31  }
32  }
33 }
- +
IDesignTimeDbContextFactory<TContext> for creating SqlServerDatabaseContexts.
static IOptions< DatabaseConfiguration > GetDbContextOptions(DatabaseType databaseType, string connectionString)
Get the IOptions<TOptions> for the DatabaseConfiguration
- + diff --git a/_sqlite_database_context_8cs.html b/_sqlite_database_context_8cs.html index 2c465eeaaa..f1e88c3755 100644 --- a/_sqlite_database_context_8cs.html +++ b/_sqlite_database_context_8cs.html @@ -25,7 +25,7 @@
diff --git a/_sqlite_database_context_8cs_source.html b/_sqlite_database_context_8cs_source.html index df65835041..a560c739e0 100644 --- a/_sqlite_database_context_8cs_source.html +++ b/_sqlite_database_context_8cs_source.html @@ -25,7 +25,7 @@ @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
For initially seeding a database
DatabaseContext<TParentContext> for MySQL
- +
Backend abstract implementation of IDatabaseContext
Configuration options for the Database.DatabaseContext<TParentContext>
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
diff --git a/_sqlite_database_context_model_snapshot_8cs.html b/_sqlite_database_context_model_snapshot_8cs.html index 7c0d10e896..97044597a4 100644 --- a/_sqlite_database_context_model_snapshot_8cs.html +++ b/_sqlite_database_context_model_snapshot_8cs.html @@ -25,7 +25,7 @@ diff --git a/_sqlite_database_context_model_snapshot_8cs_source.html b/_sqlite_database_context_model_snapshot_8cs_source.html index 6415314ccf..507a868035 100644 --- a/_sqlite_database_context_model_snapshot_8cs_source.html +++ b/_sqlite_database_context_model_snapshot_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_sqlite_design_time_db_context_factory_8cs.html b/_sqlite_design_time_db_context_factory_8cs.html index 6724d04580..2b65546ebf 100644 --- a/_sqlite_design_time_db_context_factory_8cs.html +++ b/_sqlite_design_time_db_context_factory_8cs.html @@ -25,7 +25,7 @@ @@ -103,6 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +

diff --git a/_sql_server_design_time_db_context_factory_8cs_source.html b/_sql_server_design_time_db_context_factory_8cs_source.html index 20e8d47734..e9fd8e1e13 100644 --- a/_sql_server_design_time_db_context_factory_8cs_source.html +++ b/_sql_server_design_time_db_context_factory_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite

Classes

class  Tgstation.Server.Host.Database.Design.SqliteDesignTimeDbContextFactory
 IDesignTimeDbContextFactory<TContext> for creating SqliteDatabaseContexts. More...
 
@@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
SqliteDesignTimeDbContextFactory.cs
-Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
13  sealed class SqliteDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqliteDatabaseContext>
14  {
16  public SqliteDatabaseContext CreateDbContext(string[] args)
17  {
18  using var loggerFactory = new LoggerFactory();
19  return new SqliteDatabaseContext(
20  new DbContextOptions<SqliteDatabaseContext>(),
22  DatabaseType.Sqlite,
23  "Data Source=tgs_design.sqlite3;Mode=ReadWriteCreate"),
24  new DatabaseSeeder(
26  new PasswordHasher<User>()),
27  new PlatformIdentifier()),
28  loggerFactory.CreateLogger<SqliteDatabaseContext>());
29  }
30  }
31 }
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.EntityFrameworkCore.Design;
4 using Microsoft.Extensions.Logging;
9 
10 namespace Tgstation.Server.Host.Database.Design
11 {
15  sealed class SqliteDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqliteDatabaseContext>
16  {
18  public SqliteDatabaseContext CreateDbContext(string[] args)
19  {
20  using var loggerFactory = new LoggerFactory();
21  return new SqliteDatabaseContext(
22  new DbContextOptions<SqliteDatabaseContext>(),
24  DatabaseType.Sqlite,
25  "Data Source=tgs_design.sqlite3;Mode=ReadWriteCreate"),
26  new DatabaseSeeder(
28  new PasswordHasher<User>()),
29  new PlatformIdentifier()),
30  loggerFactory.CreateLogger<SqliteDatabaseContext>());
31  }
32  }
33 }
static IOptions< DatabaseConfiguration > GetDbContextOptions(DatabaseType databaseType, string connectionString)
Get the IOptions<TOptions> for the DatabaseConfiguration
@@ -107,10 +107,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
Contains helpers for creating design time DatabaseContext<TParentContext>s
- + - +
IDesignTimeDbContextFactory<TContext> for creating SqliteDatabaseContexts.
diff --git a/_swagger_configuration_8cs.html b/_swagger_configuration_8cs.html index e73d516c65..def6f0438a 100644 --- a/_swagger_configuration_8cs.html +++ b/_swagger_configuration_8cs.html @@ -25,7 +25,7 @@
diff --git a/_swagger_configuration_8cs_source.html b/_swagger_configuration_8cs_source.html index 11efdca18c..779386fa10 100644 --- a/_swagger_configuration_8cs_source.html +++ b/_swagger_configuration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_synchronous_i_o_manager_8cs.html b/_synchronous_i_o_manager_8cs.html index 7e0a631ccd..836bec56c9 100644 --- a/_synchronous_i_o_manager_8cs.html +++ b/_synchronous_i_o_manager_8cs.html @@ -25,7 +25,7 @@ diff --git a/_synchronous_i_o_manager_8cs_source.html b/_synchronous_i_o_manager_8cs_source.html index ca729634c7..c710984414 100644 --- a/_synchronous_i_o_manager_8cs_source.html +++ b/_synchronous_i_o_manager_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_task_extensions_8cs.html b/_task_extensions_8cs.html index 8a664ea9eb..da2cb3f2af 100644 --- a/_task_extensions_8cs.html +++ b/_task_extensions_8cs.html @@ -25,7 +25,7 @@ diff --git a/_task_extensions_8cs_source.html b/_task_extensions_8cs_source.html index 9ecca07127..4e6c869e6b 100644 --- a/_task_extensions_8cs_source.html +++ b/_task_extensions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_temporary_dmb_provider_8cs.html b/_temporary_dmb_provider_8cs.html index 3cb6599957..5f42a6ca1c 100644 --- a/_temporary_dmb_provider_8cs.html +++ b/_temporary_dmb_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_temporary_dmb_provider_8cs_source.html b/_temporary_dmb_provider_8cs_source.html index 98ee78fd2c..542c2ab7e9 100644 --- a/_temporary_dmb_provider_8cs_source.html +++ b/_temporary_dmb_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_base_8cs.html b/_test_merge_base_8cs.html index 156edb1067..866416cd8c 100644 --- a/_test_merge_base_8cs.html +++ b/_test_merge_base_8cs.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_base_8cs_source.html b/_test_merge_base_8cs_source.html index 376334c3a0..f81f165553 100644 --- a/_test_merge_base_8cs_source.html +++ b/_test_merge_base_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_information_8cs.html b/_test_merge_information_8cs.html index b7b5907c4e..43e7045a00 100644 --- a/_test_merge_information_8cs.html +++ b/_test_merge_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_information_8cs_source.html b/_test_merge_information_8cs_source.html index e0f03ae830..62e04e8e7d 100644 --- a/_test_merge_information_8cs_source.html +++ b/_test_merge_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_parameters_8cs.html b/_test_merge_parameters_8cs.html index e3c48c6f2e..c809073dc8 100644 --- a/_test_merge_parameters_8cs.html +++ b/_test_merge_parameters_8cs.html @@ -25,7 +25,7 @@ diff --git a/_test_merge_parameters_8cs_source.html b/_test_merge_parameters_8cs_source.html index 6e1b0df502..4285b2cc91 100644 --- a/_test_merge_parameters_8cs_source.html +++ b/_test_merge_parameters_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgs_authorize_attribute_8cs.html b/_tgs_authorize_attribute_8cs.html index a88fb9ab3c..2ecc55224d 100644 --- a/_tgs_authorize_attribute_8cs.html +++ b/_tgs_authorize_attribute_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgs_authorize_attribute_8cs_source.html b/_tgs_authorize_attribute_8cs_source.html index 1a998abd25..226916a50c 100644 --- a/_tgs_authorize_attribute_8cs_source.html +++ b/_tgs_authorize_attribute_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html index 3bb50d62fa..6c46be9486 100644 --- a/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html index d27fac007b..8f03fe3957 100644 --- a/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html index c5ceb7f2ea..6fc4d43134 100644 --- a/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html index b824f38347..3ce294a0a5 100644 --- a/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html index 6a60424f11..f0c884b218 100644 --- a/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html index 04b53abee8..5736db1f99 100644 --- a/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html index 2d3ecb512e..765f6d0f0d 100644 --- a/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html index cd57fb8a4b..ffb5281bfa 100644 --- a/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_instance_8cs.html b/_tgstation_8_server_8_api_2_models_2_instance_8cs.html index 5d5ad20963..21f8b1bd04 100644 --- a/_tgstation_8_server_8_api_2_models_2_instance_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html index b7c820adb1..6a94aa314d 100644 --- a/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html index aed30aedd3..9c9c97c44e 100644 --- a/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html index 43f29605e5..e19edb5b17 100644 --- a/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html index 651f36636a..4bc0384e52 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html index 8bb45e6912..6253332a66 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html index b80fe8795a..69d3579d24 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html index 428116068e..7206ddaf26 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html index 1f60b8ef4a..433ab16034 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html index 654d343ef9..c2ed89608d 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html index 0d5d6a11a5..3243887388 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html index 105328429b..4ed0889c29 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html index 7ed87a04d1..848284cbf1 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html index a5f534c9a4..f2028a89d3 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html index bca67555a7..73e7580b95 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html index ccaa57311a..af3ffd6d1b 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html index a194e2cfbe..168e8995df 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html index 3124d33ca1..0920202d03 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html index db17bb021e..cd45493ff8 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html index 947cf94df9..d21ff2bd74 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_job_8cs.html b/_tgstation_8_server_8_api_2_models_2_job_8cs.html index 9305ca2330..d5b8204b14 100644 --- a/_tgstation_8_server_8_api_2_models_2_job_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html index 133c04a393..a2480a150f 100644 --- a/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_repository_8cs.html b/_tgstation_8_server_8_api_2_models_2_repository_8cs.html index d125340e8f..6f0dc80191 100644 --- a/_tgstation_8_server_8_api_2_models_2_repository_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html index 198cd3cf86..6f05dbb38d 100644 --- a/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html index 9bdbca0f7e..18ab953aba 100644 --- a/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html index ad47d77ba6..93a6c3934a 100644 --- a/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html index c0643136c5..cd369cc0b7 100644 --- a/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html index d1053e5d5b..6b1b090eb4 100644 --- a/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_user_8cs.html b/_tgstation_8_server_8_api_2_models_2_user_8cs.html index e14ff825b9..6d09c3ce15 100644 --- a/_tgstation_8_server_8_api_2_models_2_user_8cs.html +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html index 4f91c41dd9..cc0d061205 100644 --- a/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_client_2_assembly_info_8cs.html b/_tgstation_8_server_8_client_2_assembly_info_8cs.html index 6c43ec5f92..2b35c060dc 100644 --- a/_tgstation_8_server_8_client_2_assembly_info_8cs.html +++ b/_tgstation_8_server_8_client_2_assembly_info_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_client_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_client_2_assembly_info_8cs_source.html index 1c3b2ec20a..111dd73fef 100644 --- a/_tgstation_8_server_8_client_2_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_client_2_assembly_info_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs.html b/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs.html index c3ad2f7247..994e71f731 100644 --- a/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs.html +++ b/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs_source.html index df58d7fab7..49ab6f834a 100644 --- a/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs_source.html +++ b/_tgstation_8_server_8_host_2_components_2_deployment_2_dream_maker_8cs_source.html @@ -25,7 +25,7 @@ @@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DreamMaker.cs
-Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Octokit;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
20 using Tgstation.Server.Host.IO;
24 
25 namespace Tgstation.Server.Host.Components.Deployment
26 {
28  sealed class DreamMaker : IDreamMaker
29  {
33  public const string ADirectoryName = "A";
34 
38  public const string BDirectoryName = "B";
39 
43  public const string DmbExtension = ".dmb";
44 
48  const string DmeExtension = "dme";
49 
53  readonly IByondManager byond;
54 
59 
63  readonly StaticFiles.IConfiguration configuration;
64 
69 
74 
79 
84 
88  readonly IWatchdog watchdog;
89 
94 
99 
104 
108  readonly ILogger<DreamMaker> logger;
109 
113  readonly Api.Models.Instance metadata;
114 
118  readonly object compilingLock;
119 
123  bool compiling;
124 
141  public DreamMaker(
142  IByondManager byond,
143  IIOManager ioManager,
144  StaticFiles.IConfiguration configuration,
145  ISessionControllerFactory sessionControllerFactory,
146  IEventConsumer eventConsumer,
147  IChatManager chatManager,
148  IProcessExecutor processExecutor,
149  IWatchdog watchdog,
150  IGitHubClientFactory gitHubClientFactory,
151  ICompileJobSink compileJobConsumer,
152  IRepositoryManager repositoryManager,
153  ILogger<DreamMaker> logger,
154  Api.Models.Instance metadata)
155  {
156  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
157  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
158  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
159  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
160  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
161  this.chatManager = chatManager ?? throw new ArgumentNullException(nameof(chatManager));
162  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
163  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
164  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
165  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
166  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
167  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
168  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
169 
170  compilingLock = new object();
171  }
172 
180  async Task ProgressTask(Action<int> progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
181  {
182  progressReporter(0);
183  var sleepInterval = estimatedDuration / 100;
184 
185  logger.LogDebug("Compile is expected to take: {0}", estimatedDuration);
186  try
187  {
188  for (var I = 0; I < 99; ++I)
189  {
190  await Task.Delay(sleepInterval, cancellationToken).ConfigureAwait(false);
191  progressReporter(I + 1);
192  }
193  }
194  catch (OperationCanceledException) { }
195  }
196 
207  async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
208  {
209  logger.LogTrace("Verifying DMAPI...");
210  var launchParameters = new DreamDaemonLaunchParameters
211  {
212  AllowWebClient = false,
213  PrimaryPort = portToUse,
214  SecurityLevel = securityLevel,
215  StartupTimeout = timeout
216  };
217 
218  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
219 
220  job.MinimumSecurityLevel = securityLevel; // needed for the TempDmbProvider
221  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
222 
223  using var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job);
224  using var controller = await sessionControllerFactory.LaunchNew(provider, byondLock, launchParameters, true, true, true, cancellationToken).ConfigureAwait(false);
225  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
226 
227  var now = DateTimeOffset.Now;
228  if (now < timeoutAt && launchResult.StartupTime.HasValue)
229  {
230  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
231 
232  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
233  cancellationToken.ThrowIfCancellationRequested();
234  }
235 
236  if (controller.Lifetime.IsCompleted)
237  {
238  var validationStatus = controller.ApiValidationStatus;
239  logger.LogTrace("API validation status: {0}", validationStatus);
240 
241  job.DMApiVersion = controller.DMApiVersion;
242  switch (validationStatus)
243  {
244  case ApiValidationStatus.RequiresUltrasafe:
245  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
246  return;
247  case ApiValidationStatus.RequiresSafe:
248  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
249  return;
250  case ApiValidationStatus.RequiresTrusted:
251  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
252  return;
253  case ApiValidationStatus.NeverValidated:
254  throw new JobException(ErrorCode.DreamMakerNeverValidated);
255  case ApiValidationStatus.BadValidationRequest:
256  throw new JobException(ErrorCode.DreamMakerInvalidValidation);
257  case ApiValidationStatus.UnaskedValidationRequest:
258  default:
259  throw new InvalidOperationException(
260  $"Session controller returned unexpected ApiValidationStatus: {validationStatus}");
261  }
262  }
263 
264  throw new JobException(ErrorCode.DreamMakerValidationTimeout);
265  }
266 
274  async Task<int> RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
275  {
276  using var dm = processExecutor.LaunchProcess(
277  dreamMakerPath,
278  ioManager.ResolvePath(
279  ioManager.ConcatPath(
280  job.DirectoryName.ToString(),
281  ADirectoryName)),
282  $"-clean {job.DmeName}.{DmeExtension}",
283  true,
284  true,
285  true);
286  int exitCode;
287  using (cancellationToken.Register(() => dm.Terminate()))
288  exitCode = await dm.Lifetime.ConfigureAwait(false);
289  cancellationToken.ThrowIfCancellationRequested();
290 
291  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
292  job.Output = dm.GetCombinedOutput();
293  logger.LogDebug("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
294  return exitCode;
295  }
296 
303  async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
304  {
305  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
306  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
307  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
308  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
309 
310  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
311 
312  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
313  var dme = Encoding.UTF8.GetString(dmeBytes);
314 
315  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
316 
317  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
318  {
319  if (dmeModifications != null)
320  logger.LogDebug(".dme replacement configured!");
321  else
322  logger.LogTrace("No .dme modifications required.");
323  return;
324  }
325 
326  if (dmeModifications.HeadIncludeLine != null)
327  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
328  if (dmeModifications.TailIncludeLine != null)
329  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
330 
331  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
332  for (var I = 0; I < dmeLines.Count; ++I)
333  {
334  var line = dmeLines[I];
335  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
336  {
337  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
338  ++I;
339  }
340  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
341  {
342  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
343  break;
344  }
345  }
346 
347  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
348  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
349  }
350 
358  async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
359  {
360  logger.LogTrace("Cleaning compile directory...");
361  var chatTask = chatManager.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
362  var jobPath = job.DirectoryName.ToString();
363  try
364  {
365  await ioManager.DeleteDirectory(jobPath, CancellationToken.None).ConfigureAwait(false);
366  }
367  catch (Exception e)
368  {
369  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(jobPath), e);
370  }
371 
372  await chatTask.ConfigureAwait(false);
373  }
374 
382  async Task SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
383  {
384  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
385  string remoteCommitInsert;
386  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
387  {
388  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
389  remoteCommitInsert = String.Empty;
390  }
391  else
392  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
393 
394  var testmergeInsert = (revisionInformation.ActiveTestMerges?.Count ?? 0) == 0
395  ? String.Empty
396  : String.Format(
397  CultureInfo.InvariantCulture,
398  "{0}Test Merges:{1}",
399  Environment.NewLine,
400  String.Join(
401  Environment.NewLine,
402  revisionInformation
403  .ActiveTestMerges
404  .Select(x => x.TestMerge)
405  .Select(x =>
406  {
407  var result = String.Format(
408  CultureInfo.InvariantCulture,
409  "- #{0} at {1}",
410  x.Number,
411  x.PullRequestRevision.Substring(0, 7));
412 
413  if (x.Comment != null)
414  result += $": {x.Comment}";
415 
416  return result;
417  })));
418 
419  await chatManager.SendUpdateMessage(
420  String.Format(
421  CultureInfo.InvariantCulture,
422  "*Deployment Triggered*{0}Revision: {1}{2}{3}{0}BYOND Version: {4}.{5}",
423  Environment.NewLine,
424  commitInsert,
425  testmergeInsert,
426  remoteCommitInsert,
427  byondLock.Version.Major,
428  byondLock.Version.Minor),
429  cancellationToken)
430  .ConfigureAwait(false);
431  }
432 
443  async Task RunCompileJob(Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)
444  {
445  var jobPath = job.DirectoryName.ToString();
446  logger.LogTrace("Compile output GUID: {0}", jobPath);
447 
448  try
449  {
450  var dirA = ioManager.ConcatPath(jobPath, ADirectoryName);
451  var dirB = ioManager.ConcatPath(jobPath, BDirectoryName);
452 
453  // copy the repository
454  logger.LogTrace("Copying repository to game directory...");
455  var resolvedADirectory = ioManager.ResolvePath(dirA);
456  var repoOrigin = repository.Origin;
457  using (repository)
458  await repository.CopyTo(resolvedADirectory, cancellationToken).ConfigureAwait(false);
459 
460  // repository closed now
461 
462  // run precompile scripts
463  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedADirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
464 
465  // determine the dme
466  if (job.DmeName == null)
467  {
468  logger.LogTrace("Searching for available .dmes...");
469  var foundPaths = await ioManager.GetFilesWithExtension(dirA, DmeExtension, true, cancellationToken).ConfigureAwait(false);
470  var foundPath = foundPaths.FirstOrDefault();
471  if (foundPath == default)
472  throw new JobException(ErrorCode.DreamMakerNoDme);
473  var dmeWithExtension = ioManager.GetFileName(foundPath);
474  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
475  }
476  else
477  {
478  var targetDme = ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension));
479  var targetDmeExists = await ioManager.FileExists(targetDme, cancellationToken).ConfigureAwait(false);
480  if (!targetDmeExists)
481  throw new JobException(ErrorCode.DreamMakerMissingDme);
482  }
483 
484  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
485 
486  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
487 
488  // run compiler
489  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
490 
491  // verify api
492  try
493  {
494  if (exitCode != 0)
495  throw new JobException(
496  ErrorCode.DreamMakerExitCode,
497  new JobException($"Exit code: {exitCode}{Environment.NewLine}{Environment.NewLine}{job.Output}"));
498 
499  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
500  }
501  catch (JobException)
502  {
503  // DD never validated or compile failed
504  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedADirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
505  throw;
506  }
507 
508  logger.LogTrace("Running post compile event...");
509  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { resolvedADirectory }, cancellationToken).ConfigureAwait(false);
510 
511  logger.LogTrace("Duplicating compiled game...");
512 
513  // duplicate the dmb et al
514  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
515 
516  logger.LogTrace("Applying static game file symlinks...");
517 
518  // symlink in the static data
519  var symATask = configuration.SymlinkStaticFilesTo(resolvedADirectory, cancellationToken);
520  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
521 
522  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
523 
524  logger.LogDebug("Compile complete!");
525  }
526  catch (Exception e)
527  {
528  await CleanupFailedCompile(job, e is OperationCanceledException, cancellationToken).ConfigureAwait(false);
529  throw;
530  }
531  }
532 
534  #pragma warning disable CA1506
535  public async Task DeploymentProcess(
536  Models.Job job,
537  IDatabaseContextFactory databaseContextFactory,
538  Action<int> progressReporter,
539  CancellationToken cancellationToken)
540  {
541 #pragma warning disable IDE0016 // Use 'throw' expression
542  if (job == null)
543  throw new ArgumentNullException(nameof(job));
544 #pragma warning restore IDE0016 // Use 'throw' expression
545  if (databaseContextFactory == null)
546  throw new ArgumentNullException(nameof(databaseContextFactory));
547  if (progressReporter == null)
548  throw new ArgumentNullException(nameof(progressReporter));
549 
550  string repoOwner = null;
551  string repoName = null;
552  TimeSpan? averageSpan = null;
553  Models.RepositorySettings repositorySettings = null;
554  Models.DreamDaemonSettings ddSettings = null;
555  DreamMakerSettings dreamMakerSettings = null;
556  IRepository repo = null;
557  Models.CompileJob compileJob = null;
558  Models.RevisionInformation revInfo = null;
559  await databaseContextFactory.UseContext(
560  async databaseContext =>
561  {
562  averageSpan = await CalculateExpectedDeploymentTime(databaseContext, cancellationToken).ConfigureAwait(false);
563 
564  ddSettings = await databaseContext
565  .DreamDaemonSettings
566  .Where(x => x.InstanceId == metadata.Id)
567  .Select(x => new Models.DreamDaemonSettings
568  {
569  StartupTimeout = x.StartupTimeout,
570  })
571  .FirstOrDefaultAsync(cancellationToken)
572  .ConfigureAwait(false);
573  if (ddSettings == default)
574  throw new JobException(ErrorCode.InstanceMissingDreamDaemonSettings);
575 
576  dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
577  if (dreamMakerSettings == default)
578  throw new JobException(ErrorCode.InstanceMissingDreamMakerSettings);
579 
580  repositorySettings = await databaseContext
581  .RepositorySettings
582  .Where(x => x.InstanceId == metadata.Id)
583  .Select(x => new Models.RepositorySettings
584  {
585  AccessToken = x.AccessToken,
586  ShowTestMergeCommitters = x.ShowTestMergeCommitters,
587  PushTestMergeCommits = x.PushTestMergeCommits,
588  PostTestMergeComment = x.PostTestMergeComment
589  })
590  .FirstOrDefaultAsync(cancellationToken)
591  .ConfigureAwait(false);
592  if (repositorySettings == default)
593  throw new JobException(ErrorCode.InstanceMissingRepositorySettings);
594 
595  repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false);
596  try
597  {
598  if (repo == null)
599  throw new JobException(ErrorCode.RepoMissing);
600 
601  if (repo.IsGitHubRepository)
602  {
603  repoOwner = repo.GitHubOwner;
604  repoName = repo.GitHubRepoName;
605  }
606 
607  var repoSha = repo.Head;
608  revInfo = await databaseContext
609  .RevisionInformations
610  .Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id)
611  .Include(x => x.ActiveTestMerges)
612  .ThenInclude(x => x.TestMerge)
613  .ThenInclude(x => x.MergedBy)
614  .FirstOrDefaultAsync(cancellationToken)
615  .ConfigureAwait(false);
616 
617  if (revInfo == default)
618  {
619  revInfo = new Models.RevisionInformation
620  {
621  CommitSha = repoSha,
622  OriginCommitSha = repoSha,
623  Instance = new Models.Instance
624  {
625  Id = metadata.Id
626  }
627  };
628 
629  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
630  databaseContext.Instances.Attach(revInfo.Instance);
631  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
632  }
633  }
634  catch
635  {
636  repo.Dispose();
637  throw;
638  }
639  })
640  .ConfigureAwait(false);
641 
642  using (repo)
643  compileJob = await Compile(
644  revInfo,
645  dreamMakerSettings,
646  ddSettings.StartupTimeout.Value,
647  repo,
648  progressReporter,
649  averageSpan,
650  cancellationToken)
651  .ConfigureAwait(false);
652 
653  try
654  {
655  await databaseContextFactory.UseContext(
656  async databaseContext =>
657  {
658  compileJob.Job = new Models.Job
659  {
660  Id = job.Id
661  };
662  compileJob.RevisionInformation = new Models.RevisionInformation
663  {
664  Id = revInfo.Id
665  };
666 
667  databaseContext.RevisionInformations.Attach(compileJob.RevisionInformation);
668  databaseContext.Jobs.Attach(compileJob.Job);
669  databaseContext.CompileJobs.Add(compileJob);
670 
671  await PostDeploymentComments(compileJob, repositorySettings, repoOwner, repoName).ConfigureAwait(false);
672 
673  // The difficulty with compile jobs is they have a two part commit
674  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
675  try
676  {
677  await compileJobConsumer.LoadCompileJob(compileJob, cancellationToken).ConfigureAwait(false);
678  }
679  catch
680  {
681  // So we need to un-commit the compile job if the above throws
682  databaseContext.CompileJobs.Remove(compileJob);
683  await databaseContext.Save(default).ConfigureAwait(false);
684  throw;
685  }
686  })
687  .ConfigureAwait(false);
688  }
689  catch (Exception ex)
690  {
691  await CleanupFailedCompile(compileJob, ex is OperationCanceledException, default).ConfigureAwait(false);
692  throw;
693  }
694 
695  await eventConsumer.HandleEvent(EventType.DeploymentComplete, null, cancellationToken).ConfigureAwait(false);
696 
697  await chatManager.SendUpdateMessage(
698  String.Format(
699  CultureInfo.InvariantCulture,
700  "Deployment complete! Changes will be applied when DreamDaemon {0}.",
701  watchdog.Running ? "reboots" : "is launched"),
702  cancellationToken)
703  .ConfigureAwait(false);
704  }
705  #pragma warning restore CA1506
706 
713  async Task<TimeSpan?> CalculateExpectedDeploymentTime(IDatabaseContext databaseContext, CancellationToken cancellationToken)
714  {
715  var previousCompileJobs = await databaseContext.CompileJobs
716  .Where(x => x.Job.Instance.Id == metadata.Id)
717  .OrderByDescending(x => x.Job.StoppedAt)
718  .Take(10)
719  .Select(x => new Models.Job
720  {
721  StoppedAt = x.Job.StoppedAt,
722  StartedAt = x.Job.StartedAt
723  })
724  .ToListAsync(cancellationToken)
725  .ConfigureAwait(false);
726 
727  TimeSpan? averageSpan = null;
728  if (previousCompileJobs.Count != 0)
729  {
730  var totalSpan = TimeSpan.Zero;
731  foreach (var I in previousCompileJobs)
732  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
733  averageSpan = totalSpan / previousCompileJobs.Count;
734  }
735 
736  return averageSpan;
737  }
738 
739  async Task<Models.CompileJob> Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action<int> progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
740  {
741  logger.LogTrace("Begin Compile");
742 
743  lock (compilingLock)
744  {
745  if (compiling)
746  throw new JobException(ErrorCode.DreamMakerCompileJobInProgress);
747  compiling = true;
748  }
749 
750  using var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
751  var progressTask = estimatedDuration.HasValue ? ProgressTask(progressReporter, estimatedDuration.Value, cancellationToken) : Task.CompletedTask;
752  try
753  {
754  using var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false);
755  await SendDeploymentMessage(revisionInformation, byondLock, cancellationToken).ConfigureAwait(false);
756 
757  var job = new Models.CompileJob
758  {
759  DirectoryName = Guid.NewGuid(),
760  DmeName = dreamMakerSettings.ProjectName,
761  RevisionInformation = revisionInformation,
762  ByondVersion = byondLock.Version.ToString()
763  };
764 
765  await RunCompileJob(job, dreamMakerSettings, byondLock, repository, apiValidateTimeout, cancellationToken).ConfigureAwait(false);
766 
767  return job;
768  }
769  catch (OperationCanceledException)
770  {
771  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
772  throw;
773  }
774  finally
775  {
776  compiling = false;
777  progressCts.Cancel();
778  await progressTask.ConfigureAwait(false);
779  }
780  }
781 
791  Models.CompileJob compileJob,
792  Models.RepositorySettings repositorySettings,
793  string repoOwner,
794  string repoName)
795  {
796  if (repositorySettings?.AccessToken == null)
797  return;
798 
799  // potential for commenting on a test merge change
800  var outgoingCompileJob = compileJobConsumer.LatestCompileJob();
801 
802  if ((outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha == compileJob.RevisionInformation.CommitSha) || !repositorySettings.PostTestMergeComment.Value)
803  return;
804 
805  outgoingCompileJob ??= new Models.CompileJob
806  {
807  RevisionInformation = new Models.RevisionInformation
808  {
809  ActiveTestMerges = new List<RevInfoTestMerge>()
810  }
811  };
812 
813  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
814 
815  async Task CommentOnPR(int prNumber, string comment)
816  {
817  try
818  {
819  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
820  }
821  catch (ApiException e)
822  {
823  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
824  }
825  }
826 
827  var tasks = new List<Task>();
828 
829  string FormatTestMerge(Models.TestMerge testMerge, bool updated) => String.Format(CultureInfo.InvariantCulture, "#### Test Merge {4}{0}{0}##### Server Instance{0}{5}{1}{0}{0}##### Revision{0}Origin: {6}{0}Pull Request: {2}{0}Server: {7}{3}",
830  Environment.NewLine,
831  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
832  testMerge.PullRequestRevision,
833  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
834  updated ? "Updated" : "Deployed",
835  metadata.Name,
836  compileJob.RevisionInformation.OriginCommitSha,
837  compileJob.RevisionInformation.CommitSha);
838 
839  // added prs
840  foreach (var I in compileJob
842  .ActiveTestMerges
843  .Select(x => x.TestMerge)
844  .Where(x => !outgoingCompileJob
846  .ActiveTestMerges
847  .Any(y => y.TestMerge.Number == x.Number)))
848  tasks.Add(CommentOnPR(I.Number, FormatTestMerge(I, false)));
849 
850  // removed prs
851  foreach (var I in outgoingCompileJob
853  .ActiveTestMerges
854  .Select(x => x.TestMerge)
855  .Where(x => !compileJob
856  .RevisionInformation
857  .ActiveTestMerges
858  .Any(y => y.TestMerge.Number == x.Number)))
859  tasks.Add(CommentOnPR(I.Number, "#### Test Merge Removed"));
860 
861  // updated prs
862  foreach (var I in compileJob
864  .ActiveTestMerges
865  .Select(x => x.TestMerge)
866  .Where(x => outgoingCompileJob
867  .RevisionInformation
868  .ActiveTestMerges
869  .Any(y => y.TestMerge.Number == x.Number)))
870  tasks.Add(CommentOnPR(I.Number, FormatTestMerge(I, true)));
871 
872  if (tasks.Any())
873  await Task.WhenAll(tasks).ConfigureAwait(false);
874  }
875  }
876 }
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:73
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Octokit;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
20 using Tgstation.Server.Host.IO;
24 
25 namespace Tgstation.Server.Host.Components.Deployment
26 {
28  sealed class DreamMaker : IDreamMaker
29  {
33  public const string ADirectoryName = "A";
34 
38  public const string BDirectoryName = "B";
39 
43  public const string DmbExtension = ".dmb";
44 
48  const string DmeExtension = "dme";
49 
53  readonly IByondManager byond;
54 
59 
63  readonly StaticFiles.IConfiguration configuration;
64 
69 
74 
79 
84 
88  readonly IWatchdog watchdog;
89 
94 
99 
104 
108  readonly ILogger<DreamMaker> logger;
109 
113  readonly Api.Models.Instance metadata;
114 
118  readonly object compilingLock;
119 
123  bool compiling;
124 
141  public DreamMaker(
142  IByondManager byond,
143  IIOManager ioManager,
144  StaticFiles.IConfiguration configuration,
145  ISessionControllerFactory sessionControllerFactory,
146  IEventConsumer eventConsumer,
147  IChatManager chatManager,
148  IProcessExecutor processExecutor,
149  IWatchdog watchdog,
150  IGitHubClientFactory gitHubClientFactory,
151  ICompileJobSink compileJobConsumer,
152  IRepositoryManager repositoryManager,
153  ILogger<DreamMaker> logger,
154  Api.Models.Instance metadata)
155  {
156  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
157  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
158  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
159  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
160  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
161  this.chatManager = chatManager ?? throw new ArgumentNullException(nameof(chatManager));
162  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
163  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
164  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
165  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
166  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
167  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
168  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
169 
170  compilingLock = new object();
171  }
172 
180  async Task ProgressTask(Action<int> progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
181  {
182  progressReporter(0);
183  var sleepInterval = estimatedDuration / 100;
184 
185  logger.LogDebug("Compile is expected to take: {0}", estimatedDuration);
186  try
187  {
188  for (var I = 0; I < 99; ++I)
189  {
190  await Task.Delay(sleepInterval, cancellationToken).ConfigureAwait(false);
191  progressReporter(I + 1);
192  }
193  }
194  catch (OperationCanceledException) { }
195  }
196 
207  async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
208  {
209  logger.LogTrace("Verifying DMAPI...");
210  var launchParameters = new DreamDaemonLaunchParameters
211  {
212  AllowWebClient = false,
213  PrimaryPort = portToUse,
214  SecurityLevel = securityLevel,
215  StartupTimeout = timeout
216  };
217 
218  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
219 
220  job.MinimumSecurityLevel = securityLevel; // needed for the TempDmbProvider
221  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
222 
223  using var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job);
224  using var controller = await sessionControllerFactory.LaunchNew(provider, byondLock, launchParameters, true, true, true, cancellationToken).ConfigureAwait(false);
225  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
226 
227  var now = DateTimeOffset.Now;
228  if (now < timeoutAt && launchResult.StartupTime.HasValue)
229  {
230  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
231 
232  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
233  cancellationToken.ThrowIfCancellationRequested();
234  }
235 
236  if (controller.Lifetime.IsCompleted)
237  {
238  var validationStatus = controller.ApiValidationStatus;
239  logger.LogTrace("API validation status: {0}", validationStatus);
240 
241  job.DMApiVersion = controller.DMApiVersion;
242  switch (validationStatus)
243  {
244  case ApiValidationStatus.RequiresUltrasafe:
245  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
246  return;
247  case ApiValidationStatus.RequiresSafe:
248  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
249  return;
250  case ApiValidationStatus.RequiresTrusted:
251  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
252  return;
253  case ApiValidationStatus.NeverValidated:
254  throw new JobException(ErrorCode.DreamMakerNeverValidated);
255  case ApiValidationStatus.BadValidationRequest:
256  throw new JobException(ErrorCode.DreamMakerInvalidValidation);
257  case ApiValidationStatus.UnaskedValidationRequest:
258  default:
259  throw new InvalidOperationException(
260  $"Session controller returned unexpected ApiValidationStatus: {validationStatus}");
261  }
262  }
263 
264  throw new JobException(ErrorCode.DreamMakerValidationTimeout);
265  }
266 
274  async Task<int> RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
275  {
276  using var dm = processExecutor.LaunchProcess(
277  dreamMakerPath,
278  ioManager.ResolvePath(
279  ioManager.ConcatPath(
280  job.DirectoryName.ToString(),
281  ADirectoryName)),
282  $"-clean {job.DmeName}.{DmeExtension}",
283  true,
284  true,
285  true);
286  int exitCode;
287  using (cancellationToken.Register(() => dm.Terminate()))
288  exitCode = await dm.Lifetime.ConfigureAwait(false);
289  cancellationToken.ThrowIfCancellationRequested();
290 
291  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
292  job.Output = dm.GetCombinedOutput();
293  logger.LogDebug("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
294  return exitCode;
295  }
296 
303  async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
304  {
305  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
306  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
307  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
308  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
309 
310  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
311 
312  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
313  var dme = Encoding.UTF8.GetString(dmeBytes);
314 
315  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
316 
317  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
318  {
319  if (dmeModifications != null)
320  logger.LogDebug(".dme replacement configured!");
321  else
322  logger.LogTrace("No .dme modifications required.");
323  return;
324  }
325 
326  if (dmeModifications.HeadIncludeLine != null)
327  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
328  if (dmeModifications.TailIncludeLine != null)
329  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
330 
331  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
332  for (var I = 0; I < dmeLines.Count; ++I)
333  {
334  var line = dmeLines[I];
335  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
336  {
337  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
338  ++I;
339  }
340  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
341  {
342  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
343  break;
344  }
345  }
346 
347  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
348  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
349  }
350 
358  async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
359  {
360  logger.LogTrace("Cleaning compile directory...");
361  var chatTask = chatManager.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
362  var jobPath = job.DirectoryName.ToString();
363  try
364  {
365  await ioManager.DeleteDirectory(jobPath, CancellationToken.None).ConfigureAwait(false);
366  }
367  catch (Exception e)
368  {
369  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(jobPath), e);
370  }
371 
372  await chatTask.ConfigureAwait(false);
373  }
374 
382  async Task SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
383  {
384  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
385  string remoteCommitInsert;
386  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
387  {
388  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
389  remoteCommitInsert = String.Empty;
390  }
391  else
392  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
393 
394  var testmergeInsert = (revisionInformation.ActiveTestMerges?.Count ?? 0) == 0
395  ? String.Empty
396  : String.Format(
397  CultureInfo.InvariantCulture,
398  "{0}Test Merges:{1}",
399  Environment.NewLine,
400  String.Join(
401  Environment.NewLine,
402  revisionInformation
403  .ActiveTestMerges
404  .Select(x => x.TestMerge)
405  .Select(x =>
406  {
407  var result = String.Format(
408  CultureInfo.InvariantCulture,
409  "- #{0} at {1}",
410  x.Number,
411  x.PullRequestRevision.Substring(0, 7));
412 
413  if (x.Comment != null)
414  result += $": {x.Comment}";
415 
416  return result;
417  })));
418 
419  await chatManager.SendUpdateMessage(
420  String.Format(
421  CultureInfo.InvariantCulture,
422  "*Deployment Triggered*{0}Revision: {1}{2}{3}{0}BYOND Version: {4}.{5}",
423  Environment.NewLine,
424  commitInsert,
425  testmergeInsert,
426  remoteCommitInsert,
427  byondLock.Version.Major,
428  byondLock.Version.Minor),
429  cancellationToken)
430  .ConfigureAwait(false);
431  }
432 
443  async Task RunCompileJob(Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)
444  {
445  var jobPath = job.DirectoryName.ToString();
446  logger.LogTrace("Compile output GUID: {0}", jobPath);
447 
448  try
449  {
450  var dirA = ioManager.ConcatPath(jobPath, ADirectoryName);
451  var dirB = ioManager.ConcatPath(jobPath, BDirectoryName);
452 
453  // copy the repository
454  logger.LogTrace("Copying repository to game directory...");
455  var resolvedADirectory = ioManager.ResolvePath(dirA);
456  var repoOrigin = repository.Origin;
457  using (repository)
458  await repository.CopyTo(resolvedADirectory, cancellationToken).ConfigureAwait(false);
459 
460  // repository closed now
461 
462  // run precompile scripts
463  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedADirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
464 
465  // determine the dme
466  if (job.DmeName == null)
467  {
468  logger.LogTrace("Searching for available .dmes...");
469  var foundPaths = await ioManager.GetFilesWithExtension(dirA, DmeExtension, true, cancellationToken).ConfigureAwait(false);
470  var foundPath = foundPaths.FirstOrDefault();
471  if (foundPath == default)
472  throw new JobException(ErrorCode.DreamMakerNoDme);
473  var dmeWithExtension = ioManager.GetFileName(foundPath);
474  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
475  }
476  else
477  {
478  var targetDme = ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension));
479  var targetDmeExists = await ioManager.FileExists(targetDme, cancellationToken).ConfigureAwait(false);
480  if (!targetDmeExists)
481  throw new JobException(ErrorCode.DreamMakerMissingDme);
482  }
483 
484  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
485 
486  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
487 
488  // run compiler
489  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
490 
491  // verify api
492  try
493  {
494  if (exitCode != 0)
495  throw new JobException(
496  ErrorCode.DreamMakerExitCode,
497  new JobException($"Exit code: {exitCode}{Environment.NewLine}{Environment.NewLine}{job.Output}"));
498 
499  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
500  }
501  catch (JobException)
502  {
503  // DD never validated or compile failed
504  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedADirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
505  throw;
506  }
507 
508  logger.LogTrace("Running post compile event...");
509  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { resolvedADirectory }, cancellationToken).ConfigureAwait(false);
510 
511  logger.LogTrace("Duplicating compiled game...");
512 
513  // duplicate the dmb et al
514  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
515 
516  logger.LogTrace("Applying static game file symlinks...");
517 
518  // symlink in the static data
519  var symATask = configuration.SymlinkStaticFilesTo(resolvedADirectory, cancellationToken);
520  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
521 
522  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
523 
524  logger.LogDebug("Compile complete!");
525  }
526  catch (Exception e)
527  {
528  await CleanupFailedCompile(job, e is OperationCanceledException, cancellationToken).ConfigureAwait(false);
529  throw;
530  }
531  }
532 
534  #pragma warning disable CA1506
535  public async Task DeploymentProcess(
536  Models.Job job,
537  IDatabaseContextFactory databaseContextFactory,
538  Action<int> progressReporter,
539  CancellationToken cancellationToken)
540  {
541 #pragma warning disable IDE0016 // Use 'throw' expression
542  if (job == null)
543  throw new ArgumentNullException(nameof(job));
544 #pragma warning restore IDE0016 // Use 'throw' expression
545  if (databaseContextFactory == null)
546  throw new ArgumentNullException(nameof(databaseContextFactory));
547  if (progressReporter == null)
548  throw new ArgumentNullException(nameof(progressReporter));
549 
550  string repoOwner = null;
551  string repoName = null;
552  TimeSpan? averageSpan = null;
553  Models.RepositorySettings repositorySettings = null;
554  Models.DreamDaemonSettings ddSettings = null;
555  DreamMakerSettings dreamMakerSettings = null;
556  IRepository repo = null;
557  Models.CompileJob compileJob = null;
558  Models.RevisionInformation revInfo = null;
559  await databaseContextFactory.UseContext(
560  async databaseContext =>
561  {
562  averageSpan = await CalculateExpectedDeploymentTime(databaseContext, cancellationToken).ConfigureAwait(false);
563 
564  ddSettings = await databaseContext
565  .DreamDaemonSettings
566  .Where(x => x.InstanceId == metadata.Id)
567  .Select(x => new Models.DreamDaemonSettings
568  {
569  StartupTimeout = x.StartupTimeout,
570  })
571  .FirstOrDefaultAsync(cancellationToken)
572  .ConfigureAwait(false);
573  if (ddSettings == default)
574  throw new JobException(ErrorCode.InstanceMissingDreamDaemonSettings);
575 
576  dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
577  if (dreamMakerSettings == default)
578  throw new JobException(ErrorCode.InstanceMissingDreamMakerSettings);
579 
580  repositorySettings = await databaseContext
581  .RepositorySettings
582  .Where(x => x.InstanceId == metadata.Id)
583  .Select(x => new Models.RepositorySettings
584  {
585  AccessToken = x.AccessToken,
586  ShowTestMergeCommitters = x.ShowTestMergeCommitters,
587  PushTestMergeCommits = x.PushTestMergeCommits,
588  PostTestMergeComment = x.PostTestMergeComment
589  })
590  .FirstOrDefaultAsync(cancellationToken)
591  .ConfigureAwait(false);
592  if (repositorySettings == default)
593  throw new JobException(ErrorCode.InstanceMissingRepositorySettings);
594 
595  repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false);
596  try
597  {
598  if (repo == null)
599  throw new JobException(ErrorCode.RepoMissing);
600 
601  if (repo.IsGitHubRepository)
602  {
603  repoOwner = repo.GitHubOwner;
604  repoName = repo.GitHubRepoName;
605  }
606 
607  var repoSha = repo.Head;
608  revInfo = await databaseContext
609  .RevisionInformations
610  .Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id)
611  .Include(x => x.ActiveTestMerges)
612  .ThenInclude(x => x.TestMerge)
613  .ThenInclude(x => x.MergedBy)
614  .FirstOrDefaultAsync(cancellationToken)
615  .ConfigureAwait(false);
616 
617  if (revInfo == default)
618  {
619  revInfo = new Models.RevisionInformation
620  {
621  CommitSha = repoSha,
622  OriginCommitSha = repoSha,
623  Instance = new Models.Instance
624  {
625  Id = metadata.Id
626  },
627  ActiveTestMerges = new List<RevInfoTestMerge>()
628  };
629 
630  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
631  databaseContext.Instances.Attach(revInfo.Instance);
632  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
633  }
634  }
635  catch
636  {
637  repo.Dispose();
638  throw;
639  }
640  })
641  .ConfigureAwait(false);
642 
643  using (repo)
644  compileJob = await Compile(
645  revInfo,
646  dreamMakerSettings,
647  ddSettings.StartupTimeout.Value,
648  repo,
649  progressReporter,
650  averageSpan,
651  cancellationToken)
652  .ConfigureAwait(false);
653 
654  var activeCompileJob = compileJobConsumer.LatestCompileJob();
655  try
656  {
657  await databaseContextFactory.UseContext(
658  async databaseContext =>
659  {
660  compileJob.Job = new Models.Job
661  {
662  Id = job.Id
663  };
664  compileJob.RevisionInformation = new Models.RevisionInformation
665  {
666  Id = revInfo.Id
667  };
668 
669  databaseContext.Jobs.Attach(compileJob.Job);
670  databaseContext.RevisionInformations.Attach(compileJob.RevisionInformation);
671  databaseContext.CompileJobs.Add(compileJob);
672 
673  // The difficulty with compile jobs is they have a two part commit
674  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
675  try
676  {
677  await compileJobConsumer.LoadCompileJob(compileJob, cancellationToken).ConfigureAwait(false);
678  }
679  catch
680  {
681  // So we need to un-commit the compile job if the above throws
682  databaseContext.CompileJobs.Remove(compileJob);
683  await databaseContext.Save(default).ConfigureAwait(false);
684  throw;
685  }
686  })
687  .ConfigureAwait(false);
688  }
689  catch (Exception ex)
690  {
691  await CleanupFailedCompile(compileJob, ex is OperationCanceledException, default).ConfigureAwait(false);
692  throw;
693  }
694 
695  var commentsTask = PostDeploymentComments(
696  revInfo,
697  activeCompileJob?.RevisionInformation,
698  repositorySettings,
699  repoOwner,
700  repoName);
701 
702  var eventTask = eventConsumer.HandleEvent(EventType.DeploymentComplete, null, cancellationToken);
703 
704  var chatTask = chatManager.SendUpdateMessage(
705  String.Format(
706  CultureInfo.InvariantCulture,
707  "Deployment complete! Changes will be applied when DreamDaemon {0}.",
708  watchdog.Running ? "reboots" : "is launched"),
709  cancellationToken);
710 
711  try
712  {
713  await Task.WhenAll(commentsTask, eventTask, chatTask).ConfigureAwait(false);
714  }
715  catch (Exception ex)
716  {
717  throw new JobException(ErrorCode.PostDeployFailure, ex);
718  }
719  }
720  #pragma warning restore CA1506
721 
728  async Task<TimeSpan?> CalculateExpectedDeploymentTime(IDatabaseContext databaseContext, CancellationToken cancellationToken)
729  {
730  var previousCompileJobs = await databaseContext.CompileJobs
731  .Where(x => x.Job.Instance.Id == metadata.Id)
732  .OrderByDescending(x => x.Job.StoppedAt)
733  .Take(10)
734  .Select(x => new Models.Job
735  {
736  StoppedAt = x.Job.StoppedAt,
737  StartedAt = x.Job.StartedAt
738  })
739  .ToListAsync(cancellationToken)
740  .ConfigureAwait(false);
741 
742  TimeSpan? averageSpan = null;
743  if (previousCompileJobs.Count != 0)
744  {
745  var totalSpan = TimeSpan.Zero;
746  foreach (var I in previousCompileJobs)
747  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
748  averageSpan = totalSpan / previousCompileJobs.Count;
749  }
750 
751  return averageSpan;
752  }
753 
754  async Task<Models.CompileJob> Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action<int> progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
755  {
756  logger.LogTrace("Begin Compile");
757 
758  lock (compilingLock)
759  {
760  if (compiling)
761  throw new JobException(ErrorCode.DreamMakerCompileJobInProgress);
762  compiling = true;
763  }
764 
765  using var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
766  var progressTask = estimatedDuration.HasValue ? ProgressTask(progressReporter, estimatedDuration.Value, cancellationToken) : Task.CompletedTask;
767  try
768  {
769  using var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false);
770  await SendDeploymentMessage(revisionInformation, byondLock, cancellationToken).ConfigureAwait(false);
771 
772  var job = new Models.CompileJob
773  {
774  DirectoryName = Guid.NewGuid(),
775  DmeName = dreamMakerSettings.ProjectName,
776  RevisionInformation = revisionInformation,
777  ByondVersion = byondLock.Version.ToString()
778  };
779 
780  await RunCompileJob(job, dreamMakerSettings, byondLock, repository, apiValidateTimeout, cancellationToken).ConfigureAwait(false);
781 
782  return job;
783  }
784  catch (OperationCanceledException)
785  {
786  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
787  throw;
788  }
789  finally
790  {
791  compiling = false;
792  progressCts.Cancel();
793  await progressTask.ConfigureAwait(false);
794  }
795  }
796 
807  Models.RevisionInformation deployedRevisionInformation,
808  Models.RevisionInformation previousRevisionInformation,
809  Models.RepositorySettings repositorySettings,
810  string repoOwner,
811  string repoName)
812  {
813  if (repositorySettings?.AccessToken == null)
814  return;
815 
816  if ((previousRevisionInformation != null && previousRevisionInformation.CommitSha == previousRevisionInformation.CommitSha)
817  || !repositorySettings.PostTestMergeComment.Value)
818  return;
819 
820  previousRevisionInformation = new Models.RevisionInformation
821  {
822  ActiveTestMerges = new List<RevInfoTestMerge>()
823  };
824 
825  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
826 
827  async Task CommentOnPR(int prNumber, string comment)
828  {
829  try
830  {
831  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
832  }
833  catch (ApiException e)
834  {
835  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
836  }
837  }
838 
839  var tasks = new List<Task>();
840 
841  string FormatTestMerge(Models.TestMerge testMerge, bool updated) => String.Format(CultureInfo.InvariantCulture, "#### Test Merge {4}{0}{0}##### Server Instance{0}{5}{1}{0}{0}##### Revision{0}Origin: {6}{0}Pull Request: {2}{0}Server: {7}{3}",
842  Environment.NewLine,
843  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
844  testMerge.PullRequestRevision,
845  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
846  updated ? "Updated" : "Deployed",
847  metadata.Name,
848  deployedRevisionInformation.OriginCommitSha,
849  deployedRevisionInformation.CommitSha);
850 
851  // added prs
852  foreach (var I in deployedRevisionInformation
853  .ActiveTestMerges
854  .Select(x => x.TestMerge)
855  .Where(x => !previousRevisionInformation
856  .ActiveTestMerges
857  .Any(y => y.TestMerge.Number == x.Number)))
858  tasks.Add(CommentOnPR(I.Number, FormatTestMerge(I, false)));
859 
860  // removed prs
861  foreach (var I in previousRevisionInformation
862  .ActiveTestMerges
863  .Select(x => x.TestMerge)
864  .Where(x => !deployedRevisionInformation
865  .ActiveTestMerges
866  .Any(y => y.TestMerge.Number == x.Number)))
867  tasks.Add(CommentOnPR(I.Number, "#### Test Merge Removed"));
868 
869  // updated prs
870  foreach (var I in deployedRevisionInformation
871  .ActiveTestMerges
872  .Select(x => x.TestMerge)
873  .Where(x => previousRevisionInformation
874  .ActiveTestMerges
875  .Any(y => y.TestMerge.Number == x.Number)))
876  tasks.Add(CommentOnPR(I.Number, FormatTestMerge(I, true)));
877 
878  if (tasks.Any())
879  await Task.WhenAll(tasks).ConfigureAwait(false);
880  }
881  }
882 }
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:73
ApiValidationStatus
Status of DMAPI validation
@@ -137,11 +137,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for DreamMaker
Definition: DreamMaker.cs:68
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:58
- +
string GitHubRepoName
The Octokit.Repository.Name if this IsGitHubRepository
Definition: IRepository.cs:26
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:9
async Task< int > RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
Compiles a .dme with DreamMaker
Definition: DreamMaker.cs:274
Represents a git repository
Definition: Repository.cs:8
+
async Task PostDeploymentComments(Models.RevisionInformation deployedRevisionInformation, Models.RevisionInformation previousRevisionInformation, Models.RepositorySettings repositorySettings, string repoOwner, string repoName)
Post deployment GitHub comments.
Definition: DreamMaker.cs:806
readonly IByondManager byond
The IByondManager for DreamMaker
Definition: DreamMaker.cs:53
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
@@ -152,7 +153,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:88
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
async Task RunCompileJob(Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)
Executes and populate a given job
Definition: DreamMaker.cs:443
-
async Task PostDeploymentComments(Models.CompileJob compileJob, Models.RepositorySettings repositorySettings, string repoOwner, string repoName)
Post deployment GitHub comments.
Definition: DreamMaker.cs:790
Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
Represents usage of the two primary BYOND server executables
@@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool IsGitHubRepository
If the IRepository was cloned from GitHub.com
Definition: IRepository.cs:16
DreamDaemonSecurity
DreamDaemon&#39;s security level
-
async Task< Models.CompileJob > Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan?estimatedDuration, CancellationToken cancellationToken)
Definition: DreamMaker.cs:739
+
async Task< Models.CompileJob > Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan?estimatedDuration, CancellationToken cancellationToken)
Definition: DreamMaker.cs:754
Task< List< TModel > > ToListAsync(CancellationToken cancellationToken)
Retrieve all the TModel s in the table.
Interface for using filesystems
Definition: IIOManager.cs:11
async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
Cleans up a failed compile job
Definition: DreamMaker.cs:358
@@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
readonly IChatManager chatManager
The IChatManager for DreamMaker
Definition: DreamMaker.cs:78
-
async Task< TimeSpan?> CalculateExpectedDeploymentTime(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Calculate the average length of a deployment using a given databaseContext .
Definition: DreamMaker.cs:713
+
async Task< TimeSpan?> CalculateExpectedDeploymentTime(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Calculate the average length of a deployment using a given databaseContext .
Definition: DreamMaker.cs:728
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:13
diff --git a/_tgstation_8_server_8_host_2_components_2_instance_8cs.html b/_tgstation_8_server_8_host_2_components_2_instance_8cs.html index 3a1ec47f19..b835c18df2 100644 --- a/_tgstation_8_server_8_host_2_components_2_instance_8cs.html +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs.html @@ -25,7 +25,7 @@
diff --git a/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html index 7393e8cdb3..a42405a9d2 100644 --- a/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html index d3eed5c644..c57fd34252 100644 --- a/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html index f299124349..84399fe0a9 100644 --- a/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html index 72cc2de567..c29bafc37d 100644 --- a/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html index 9bb968dbb1..365733d162 100644 --- a/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html index a44bbd9430..9c49ccefb7 100644 --- a/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html index 6f2ef276a5..2cde30835f 100644 --- a/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html index df4e053aa8..c170468a22 100644 --- a/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html index f3aa0179ba..72e35e486d 100644 --- a/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html index fe2ca1ec85..b3e4793238 100644 --- a/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html index 4385fb3505..17002a14dc 100644 --- a/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_instance_8cs.html b/_tgstation_8_server_8_host_2_models_2_instance_8cs.html index 15f101a0a5..65998bc7ec 100644 --- a/_tgstation_8_server_8_host_2_models_2_instance_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html index 8bc3df49df..b83a1a90f5 100644 --- a/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html index a9824b32a6..2e7d6de1a8 100644 --- a/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html index a757f8a860..d85aa1dfb2 100644 --- a/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_job_8cs.html b/_tgstation_8_server_8_host_2_models_2_job_8cs.html index 274fdbc029..e979849ed5 100644 --- a/_tgstation_8_server_8_host_2_models_2_job_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html index 77e5b86031..51fe0041c4 100644 --- a/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html index 997321aec0..6f25e2822f 100644 --- a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html index 571629b204..39faba9929 100644 --- a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html index 8139b5c94c..472a9ad224 100644 --- a/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html index aa9eb5968a..d147acf0e2 100644 --- a/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html index 0434ec7024..a9c07b261c 100644 --- a/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html index d1aeb50844..90de4886f4 100644 --- a/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_user_8cs.html b/_tgstation_8_server_8_host_2_models_2_user_8cs.html index d098f70bee..77f20fc5ef 100644 --- a/_tgstation_8_server_8_host_2_models_2_user_8cs.html +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html index dc2de9c393..0c3526e1be 100644 --- a/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs.html b/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs.html index 4e37f06eef..27dff2032e 100644 --- a/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs_source.html index 92d819a81e..791d452a4e 100644 --- a/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_2_properties_2_assembly_info_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html index ca5a0378b8..fca88f3ed2 100644 --- a/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html index ee7cb00a71..19d651e267 100644 --- a/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html index b840db9318..b2553bc5c5 100644 --- a/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html index 5a9c4b7032..8fe3c646a8 100644 --- a/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html index a4bd7965a7..86f6b6ea12 100644 --- a/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html @@ -25,7 +25,7 @@ diff --git a/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html index 31b8736688..146bb365af 100644 --- a/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_token_8cs.html b/_token_8cs.html index 6bedea56bb..befc6d7e8d 100644 --- a/_token_8cs.html +++ b/_token_8cs.html @@ -25,7 +25,7 @@ diff --git a/_token_8cs_source.html b/_token_8cs_source.html index fa8c58b92a..11b22d924a 100644 --- a/_token_8cs_source.html +++ b/_token_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_token_factory_8cs.html b/_token_factory_8cs.html index 1c8e036f32..ef060a9c2e 100644 --- a/_token_factory_8cs.html +++ b/_token_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_token_factory_8cs_source.html b/_token_factory_8cs_source.html index ed06bc1ae6..a20e49e6a7 100644 --- a/_token_factory_8cs_source.html +++ b/_token_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_topic_command_type_8cs.html b/_topic_command_type_8cs.html index 5de9a85a0f..32ad8769da 100644 --- a/_topic_command_type_8cs.html +++ b/_topic_command_type_8cs.html @@ -25,7 +25,7 @@ diff --git a/_topic_command_type_8cs_source.html b/_topic_command_type_8cs_source.html index 8fb8010af1..d0066954fa 100644 --- a/_topic_command_type_8cs_source.html +++ b/_topic_command_type_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_topic_parameters_8cs.html b/_topic_parameters_8cs.html index 449dec2c28..fe359a596f 100644 --- a/_topic_parameters_8cs.html +++ b/_topic_parameters_8cs.html @@ -25,7 +25,7 @@ diff --git a/_topic_parameters_8cs_source.html b/_topic_parameters_8cs_source.html index cc19cdf731..9f8b990831 100644 --- a/_topic_parameters_8cs_source.html +++ b/_topic_parameters_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_topic_response_8cs.html b/_topic_response_8cs.html index efbe6c5945..866d29cac4 100644 --- a/_topic_response_8cs.html +++ b/_topic_response_8cs.html @@ -25,7 +25,7 @@ diff --git a/_topic_response_8cs_source.html b/_topic_response_8cs_source.html index 2b07c5f113..4fb83df6b7 100644 --- a/_topic_response_8cs_source.html +++ b/_topic_response_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_unauthorized_exception_8cs.html b/_unauthorized_exception_8cs.html index 29b3983bba..69e8aa1afd 100644 --- a/_unauthorized_exception_8cs.html +++ b/_unauthorized_exception_8cs.html @@ -25,7 +25,7 @@ diff --git a/_unauthorized_exception_8cs_source.html b/_unauthorized_exception_8cs_source.html index f80576f7a0..9bcf8f8812 100644 --- a/_unauthorized_exception_8cs_source.html +++ b/_unauthorized_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_unrecognized_response_exception_8cs.html b/_unrecognized_response_exception_8cs.html index 1b9ed38ba1..fccedc9b3c 100644 --- a/_unrecognized_response_exception_8cs.html +++ b/_unrecognized_response_exception_8cs.html @@ -25,7 +25,7 @@ diff --git a/_unrecognized_response_exception_8cs_source.html b/_unrecognized_response_exception_8cs_source.html index ba054a0c91..e6c9ed307f 100644 --- a/_unrecognized_response_exception_8cs_source.html +++ b/_unrecognized_response_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_updates_configuration_8cs.html b/_updates_configuration_8cs.html index 15b5aeba21..59760def25 100644 --- a/_updates_configuration_8cs.html +++ b/_updates_configuration_8cs.html @@ -25,7 +25,7 @@ diff --git a/_updates_configuration_8cs_source.html b/_updates_configuration_8cs_source.html index 873d5492f4..38e3a9bb4d 100644 --- a/_updates_configuration_8cs_source.html +++ b/_updates_configuration_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_user_controller_8cs.html b/_user_controller_8cs.html index 78f450f74c..53287fc694 100644 --- a/_user_controller_8cs.html +++ b/_user_controller_8cs.html @@ -25,7 +25,7 @@ diff --git a/_user_controller_8cs_source.html b/_user_controller_8cs_source.html index 3bb1cbdc27..cde9c71c2c 100644 --- a/_user_controller_8cs_source.html +++ b/_user_controller_8cs_source.html @@ -25,7 +25,7 @@ @@ -116,12 +116,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
Contains various cryptographic functions
- -
DbSet< User > Users
The Users in the DatabaseContext<TParentContext>.
+
Backend abstract implementation of IDatabaseContext
+
DbSet< User > Users
The Users in the DatabaseContext<TParentContext>.
async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific Api.Models.User.
Routes to a server actions
Definition: Routes.cs:9
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserController
- +
InstanceManagerRights
Rights for managing Models.Instances
diff --git a/_user_update_8cs.html b/_user_update_8cs.html index 9200212814..ad82d33098 100644 --- a/_user_update_8cs.html +++ b/_user_update_8cs.html @@ -25,7 +25,7 @@ diff --git a/_user_update_8cs_source.html b/_user_update_8cs_source.html index 90af835694..e97c153e8e 100644 --- a/_user_update_8cs_source.html +++ b/_user_update_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_users_client_8cs.html b/_users_client_8cs.html index e194305f57..180f41cd09 100644 --- a/_users_client_8cs.html +++ b/_users_client_8cs.html @@ -25,7 +25,7 @@ diff --git a/_users_client_8cs_source.html b/_users_client_8cs_source.html index 4a776e5e78..43ef07deba 100644 --- a/_users_client_8cs_source.html +++ b/_users_client_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_version_command_8cs.html b/_version_command_8cs.html index 695cf80da8..f573d1f8a0 100644 --- a/_version_command_8cs.html +++ b/_version_command_8cs.html @@ -25,7 +25,7 @@ diff --git a/_version_command_8cs_source.html b/_version_command_8cs_source.html index 8d806eca7e..673226a4bb 100644 --- a/_version_command_8cs_source.html +++ b/_version_command_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_version_converter_8cs.html b/_version_converter_8cs.html index 3e61d6a66f..9307419abc 100644 --- a/_version_converter_8cs.html +++ b/_version_converter_8cs.html @@ -25,7 +25,7 @@ diff --git a/_version_converter_8cs_source.html b/_version_converter_8cs_source.html index 4718f79453..81b9d0d1c0 100644 --- a/_version_converter_8cs_source.html +++ b/_version_converter_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_version_extensions_8cs.html b/_version_extensions_8cs.html index 885e304a86..e100fa0695 100644 --- a/_version_extensions_8cs.html +++ b/_version_extensions_8cs.html @@ -25,7 +25,7 @@ diff --git a/_version_extensions_8cs_source.html b/_version_extensions_8cs_source.html index 2be139d1fd..372b02e300 100644 --- a/_version_extensions_8cs_source.html +++ b/_version_extensions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_version_mismatch_exception_8cs.html b/_version_mismatch_exception_8cs.html index 451853393b..bc7641dc55 100644 --- a/_version_mismatch_exception_8cs.html +++ b/_version_mismatch_exception_8cs.html @@ -25,7 +25,7 @@ diff --git a/_version_mismatch_exception_8cs_source.html b/_version_mismatch_exception_8cs_source.html index 28ae19ccac..d2de40a15d 100644 --- a/_version_mismatch_exception_8cs_source.html +++ b/_version_mismatch_exception_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_i_watchdog_8cs.html b/_watchdog_2_i_watchdog_8cs.html index 4484ddba66..a191025c14 100644 --- a/_watchdog_2_i_watchdog_8cs.html +++ b/_watchdog_2_i_watchdog_8cs.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_i_watchdog_8cs_source.html b/_watchdog_2_i_watchdog_8cs_source.html index 24f8eb18f1..3a2a42232d 100644 --- a/_watchdog_2_i_watchdog_8cs_source.html +++ b/_watchdog_2_i_watchdog_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_i_watchdog_factory_8cs.html b/_watchdog_2_i_watchdog_factory_8cs.html index 1a8b6d90a5..43f7752489 100644 --- a/_watchdog_2_i_watchdog_factory_8cs.html +++ b/_watchdog_2_i_watchdog_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_i_watchdog_factory_8cs_source.html b/_watchdog_2_i_watchdog_factory_8cs_source.html index 6bf3101072..e41dd09367 100644 --- a/_watchdog_2_i_watchdog_factory_8cs_source.html +++ b/_watchdog_2_i_watchdog_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_watchdog_factory_8cs.html b/_watchdog_2_watchdog_factory_8cs.html index ae7a1f4552..8dee88c55c 100644 --- a/_watchdog_2_watchdog_factory_8cs.html +++ b/_watchdog_2_watchdog_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_2_watchdog_factory_8cs_source.html b/_watchdog_2_watchdog_factory_8cs_source.html index f111ee2f57..d696ed25a9 100644 --- a/_watchdog_2_watchdog_factory_8cs_source.html +++ b/_watchdog_2_watchdog_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_8cs.html b/_watchdog_8cs.html index ed7405fc16..49c15f47ee 100644 --- a/_watchdog_8cs.html +++ b/_watchdog_8cs.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_8cs_source.html b/_watchdog_8cs_source.html index 49e5bf1fbe..704ac58366 100644 --- a/_watchdog_8cs_source.html +++ b/_watchdog_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_base_8cs.html b/_watchdog_base_8cs.html index 294027bd76..9c0ee6b0c7 100644 --- a/_watchdog_base_8cs.html +++ b/_watchdog_base_8cs.html @@ -25,7 +25,7 @@ diff --git a/_watchdog_base_8cs_source.html b/_watchdog_base_8cs_source.html index 7836899735..dd4843531f 100644 --- a/_watchdog_base_8cs_source.html +++ b/_watchdog_base_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_web_host_builder_extensions_8cs.html b/_web_host_builder_extensions_8cs.html index e50c773e07..20586bf798 100644 --- a/_web_host_builder_extensions_8cs.html +++ b/_web_host_builder_extensions_8cs.html @@ -25,7 +25,7 @@ diff --git a/_web_host_builder_extensions_8cs_source.html b/_web_host_builder_extensions_8cs_source.html index 80b121a03d..1edd46e6fc 100644 --- a/_web_host_builder_extensions_8cs_source.html +++ b/_web_host_builder_extensions_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_byond_installer_8cs.html b/_windows_byond_installer_8cs.html index f6bd06f09e..cdabd530e1 100644 --- a/_windows_byond_installer_8cs.html +++ b/_windows_byond_installer_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_byond_installer_8cs_source.html b/_windows_byond_installer_8cs_source.html index 83226637b9..d914a5156e 100644 --- a/_windows_byond_installer_8cs_source.html +++ b/_windows_byond_installer_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_network_prompt_reaper_8cs.html b/_windows_network_prompt_reaper_8cs.html index f5b99abe5a..4cbb458bfb 100644 --- a/_windows_network_prompt_reaper_8cs.html +++ b/_windows_network_prompt_reaper_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_network_prompt_reaper_8cs_source.html b/_windows_network_prompt_reaper_8cs_source.html index fb9c1708bd..7dbd00cc90 100644 --- a/_windows_network_prompt_reaper_8cs_source.html +++ b/_windows_network_prompt_reaper_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_post_write_handler_8cs.html b/_windows_post_write_handler_8cs.html index eef54a6f49..b78bdedd9e 100644 --- a/_windows_post_write_handler_8cs.html +++ b/_windows_post_write_handler_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_post_write_handler_8cs_source.html b/_windows_post_write_handler_8cs_source.html index 4650f4bd88..4381ebb6ba 100644 --- a/_windows_post_write_handler_8cs_source.html +++ b/_windows_post_write_handler_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_process_features_8cs.html b/_windows_process_features_8cs.html index cbc5769ea7..e50a15bd45 100644 --- a/_windows_process_features_8cs.html +++ b/_windows_process_features_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_process_features_8cs_source.html b/_windows_process_features_8cs_source.html index f27534533d..bd703817f3 100644 --- a/_windows_process_features_8cs_source.html +++ b/_windows_process_features_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_swappable_dmb_provider_8cs.html b/_windows_swappable_dmb_provider_8cs.html index 8ce34a61c4..e4660eb80d 100644 --- a/_windows_swappable_dmb_provider_8cs.html +++ b/_windows_swappable_dmb_provider_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_swappable_dmb_provider_8cs_source.html b/_windows_swappable_dmb_provider_8cs_source.html index 1573f44ee7..fa625dd23e 100644 --- a/_windows_swappable_dmb_provider_8cs_source.html +++ b/_windows_swappable_dmb_provider_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_symlink_factory_8cs.html b/_windows_symlink_factory_8cs.html index 09689c7370..5592095de5 100644 --- a/_windows_symlink_factory_8cs.html +++ b/_windows_symlink_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_symlink_factory_8cs_source.html b/_windows_symlink_factory_8cs_source.html index 1f4fee9b4c..946e4814c7 100644 --- a/_windows_symlink_factory_8cs_source.html +++ b/_windows_symlink_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_system_identity_8cs.html b/_windows_system_identity_8cs.html index 1246d026cd..c4076489fc 100644 --- a/_windows_system_identity_8cs.html +++ b/_windows_system_identity_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_system_identity_8cs_source.html b/_windows_system_identity_8cs_source.html index 5efd79edc0..f5296ce6b7 100644 --- a/_windows_system_identity_8cs_source.html +++ b/_windows_system_identity_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_system_identity_factory_8cs.html b/_windows_system_identity_factory_8cs.html index 9312630b93..7371f9ac73 100644 --- a/_windows_system_identity_factory_8cs.html +++ b/_windows_system_identity_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_system_identity_factory_8cs_source.html b/_windows_system_identity_factory_8cs_source.html index bb5fd66179..8f81df5728 100644 --- a/_windows_system_identity_factory_8cs_source.html +++ b/_windows_system_identity_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_watchdog_8cs.html b/_windows_watchdog_8cs.html index 7c942c1944..e2024eb880 100644 --- a/_windows_watchdog_8cs.html +++ b/_windows_watchdog_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_watchdog_8cs_source.html b/_windows_watchdog_8cs_source.html index 97ff3676b4..288081c6de 100644 --- a/_windows_watchdog_8cs_source.html +++ b/_windows_watchdog_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/_windows_watchdog_factory_8cs.html b/_windows_watchdog_factory_8cs.html index f92b17ca70..64e57313cc 100644 --- a/_windows_watchdog_factory_8cs.html +++ b/_windows_watchdog_factory_8cs.html @@ -25,7 +25,7 @@ diff --git a/_windows_watchdog_factory_8cs_source.html b/_windows_watchdog_factory_8cs_source.html index 0e8a36956b..151a2bd75e 100644 --- a/_windows_watchdog_factory_8cs_source.html +++ b/_windows_watchdog_factory_8cs_source.html @@ -25,7 +25,7 @@ diff --git a/annotated.html b/annotated.html index 9a82009094..0a66c35ec2 100644 --- a/annotated.html +++ b/annotated.html @@ -25,7 +25,7 @@ @@ -94,512 +94,437 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 12345678]

diff --git a/_sqlite_design_time_db_context_factory_8cs_source.html b/_sqlite_design_time_db_context_factory_8cs_source.html index 3567b6b2a0..bb2581f95d 100644 --- a/_sqlite_design_time_db_context_factory_8cs_source.html +++ b/_sqlite_design_time_db_context_factory_8cs_source.html @@ -25,7 +25,7 @@

tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
[detail level 1234567]
 NReleaseNotes
 CProgramContains the application entrypoint
 NTgstation
 NServer
 NApi
 NModels
 NRights
 NTests
 CApiHeadersRepresents the header that must be present for every server request
 CRoutesRoutes to a server actions
 CVersionExtensionsExtensions for the Version .
 NClient
 NComponents
 NTests
 CAdministrationClient
 CApiClient
 CApiClientFactory
 CApiConflictExceptionOccurs when the server returns a bad request response if the ApiException.ErrorCode is present. The server returned an unknown reponse otherwise.
 CApiExceptionAPI related Exceptions.
 CClientExceptionExceptions thrown by IServerClients
 CConflictExceptionOccurs when the client performs an action that would result in data conflict
 CHttpClient
 CIAdministrationClientFor managing server administration
 CIApiClientWeb interface for the API
 CIApiClientFactoryFor creating IApiClients
 CIHttpClientFor sending HTTP requests
 CIInstanceManagerClientFor managing Instances
 CInstanceManagerClient
 CInsufficientPermissionsExceptionOccurs when the client attempts to perform an action they do not have the rights for
 CIRequestLoggerFor logging HTTP requests and responses
 CIServerClientMain client for communicating with a server
 CIServerClientFactoryFactory for creating IServerClients
 CIUsersClientFor managing Users
 CMethodNotSupportedExceptionOccurs when the client tries to use a currently unsupported API
 CRateLimitExceptionOccurs when a GitHub rate limit occurs
 CRequestTimeoutExceptionOccurs when the client provides invalid credentials
 CServerClient
 CServerClientFactory
 CServerErrorExceptionOccurs when an error occurs in the server
 CServiceUnavailableExceptionOccurs when the client makes a request while the server is starting or stopping
 CUnauthorizedExceptionOccurs when the client provides invalid credentials
 CUnrecognizedResponseExceptionOccurs when a response is received that did not deserialize to one of the expected Api.Models
 CUsersClient
 CVersionMismatchExceptionOccurs when the API version of the client is not compatible with the server's
 NHost
 NComponents
 NConfiguration
 NConsole
 NControllers
 NCore
 NDatabase
 NExtensions
 NIO
 NJobs
 NModels
 NSecurity
 NService
 NSetup
 NSystem
 NTests
 NWatchdog
 CIServerRepresents the host
 CIServerFactoryFor creating IServers
 CNativeMethodsNative Windows methods used by the code
 CProgramEntrypoint for the Process
 CServer
 CServerFactoryImplementation of IServerFactory.
 NTests
 NInstance
 CAdministrationTest
 CApiAssertExtension methods for the Assert .
 CInstanceManagerTest
 CIntegrationTest
 CTestingServer
 CUsersTest
 CVersionsTest
 CAuthorizeAttribute
 CController
 CDbContext
 CIDesignTimeDbContextFactory
 CIDisposable
 CIDocumentFilter
 CIHostApplicationLifetime
 CIHostedService
 CIOpenApiExtension
 CIOperationFilter
 CIQueryable
 CISchemaFilter
 CJsonConverter
 CMigration
 CModelSnapshot
 CServiceBase
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NTgstation
 NServer
 NApi
 NModels
 NRights
 CApiHeadersRepresents the header that must be present for every server request
 CRoutesRoutes to a server actions
 CVersionExtensionsExtensions for the Version .
 NClient
 NComponents
 CAdministrationClient
 CApiClient
 CApiClientFactory
 CApiConflictExceptionOccurs when the server returns a bad request response if the ApiException.ErrorCode is present. The server returned an unknown reponse otherwise.
 CApiExceptionAPI related Exceptions.
 CClientExceptionExceptions thrown by IServerClients
 CConflictExceptionOccurs when the client performs an action that would result in data conflict
 CHttpClient
 CIAdministrationClientFor managing server administration
 CIApiClientWeb interface for the API
 CIApiClientFactoryFor creating IApiClients
 CIHttpClientFor sending HTTP requests
 CIInstanceManagerClientFor managing Instances
 CInstanceManagerClient
 CInsufficientPermissionsExceptionOccurs when the client attempts to perform an action they do not have the rights for
 CIRequestLoggerFor logging HTTP requests and responses
 CIServerClientMain client for communicating with a server
 CIServerClientFactoryFactory for creating IServerClients
 CIUsersClientFor managing Users
 CMethodNotSupportedExceptionOccurs when the client tries to use a currently unsupported API
 CRateLimitExceptionOccurs when a GitHub rate limit occurs
 CRequestTimeoutExceptionOccurs when the client provides invalid credentials
 CServerClient
 CServerClientFactory
 CServerErrorExceptionOccurs when an error occurs in the server
 CServiceUnavailableExceptionOccurs when the client makes a request while the server is starting or stopping
 CUnauthorizedExceptionOccurs when the client provides invalid credentials
 CUnrecognizedResponseExceptionOccurs when a response is received that did not deserialize to one of the expected Api.Models
 CUsersClient
 CVersionMismatchExceptionOccurs when the API version of the client is not compatible with the server's
 NHost
 NComponents
 NConfiguration
 NConsole
 NControllers
 NCore
 NDatabase
 NExtensions
 NIO
 NJobs
 NModels
 NSecurity
 NService
 NSetup
 NSystem
 NWatchdog
 CIServerRepresents the host
 CIServerFactoryFor creating IServers
 CNativeMethodsNative Windows methods used by the code
 CProgramEntrypoint for the Process
 CServer
 CServerFactoryImplementation of IServerFactory.
 CAuthorizeAttribute
 CController
 CDbContext
 CIDesignTimeDbContextFactory
 CIDisposable
 CIDocumentFilter
 CIHostedService
 CIOpenApiExtension
 CIOperationFilter
 CIQueryable
 CISchemaFilter
 CJsonConverter
 CMigration
 CModelSnapshot
 CServiceBase
diff --git a/api.html b/api.html index 4ee6018192..baa7997757 100644 --- a/api.html +++ b/api.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/architecture.html b/architecture.html index ec49c3bb0b..632af3c395 100644 --- a/architecture.html +++ b/architecture.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/class_authorize_attribute.html b/class_authorize_attribute.html index aa6c2b5077..655df72634 100644 --- a/class_authorize_attribute.html +++ b/class_authorize_attribute.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/class_controller.html b/class_controller.html index f633062520..d9990f40e5 100644 --- a/class_controller.html +++ b/class_controller.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
diff --git a/class_db_context.html b/class_db_context.html index ed6108c8d6..556a0c5c96 100644 --- a/class_db_context.html +++ b/class_db_context.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -98,7 +98,7 @@ Inheritance diagram for DbContext:
Inheritance graph
- +
[legend]

The documentation for this class was generated from the following file: diff --git a/functions_e.html b/functions_e.html index ff63e67a0e..ddc4ff6d34 100644 --- a/functions_e.html +++ b/functions_e.html @@ -25,7 +25,7 @@ Logo
tgstation-server -  4.2.4 +  4.2.5
The /tg/station 13 server suite
@@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/functions_enum.html b/functions_enum.html index 3e2e26b2a1..1fb8f7033e 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_f.html b/functions_f.html index c69b08ee05..74cc710942 100644 --- a/functions_f.html +++ b/functions_f.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -131,9 +130,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here is a list of all class members with links to the classes they belong to:

    - f -

    diff --git a/functions_func_c.html b/functions_func_c.html index 5b7a15ec68..777e88b367 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -184,9 +184,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • ChatManagerFactory() : Tgstation.Server.Host.Components.Chat.ChatManagerFactory
  • -
  • ChatTest() -: Tgstation.Server.Tests.Instance.ChatTest -
  • ChatTrackingContext() : Tgstation.Server.Host.Components.Chat.ChatTrackingContext
  • @@ -202,9 +199,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • CheckDisposed() : Tgstation.Server.Host.Components.Session.SessionController
  • -
  • CheckDMApiFail() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • CheckExceptionPropagation() : Tgstation.Server.Host.Server
  • @@ -217,7 +211,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Checkout() : Tgstation.Server.Host.Components.Repository.ILibGit2Commands , Tgstation.Server.Host.Components.Repository.LibGit2Commands -, Tgstation.Server.Tests.Instance.RepositoryTest
  • CheckoutObject() : Tgstation.Server.Host.Components.Repository.IRepository @@ -279,7 +272,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Chat.Providers.IrcProvider
  • ClientException() -: Tgstation.Server.Client.ClientException +: Tgstation.Server.Client.ClientException
  • Clone() : Tgstation.Server.Client.Components.IRepositoryClient @@ -330,9 +323,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • ConfigurationFile() : Tgstation.Server.Client.Components.ConfigurationClient
  • -
  • ConfigurationTest() -: Tgstation.Server.Tests.Instance.ConfigurationTest -
  • Configure() : Tgstation.Server.Host.Core.Application , Tgstation.Server.Host.Core.SwaggerConfiguration @@ -408,11 +398,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Controllers.UserController
  • Create< TBody, TResult >() -: Tgstation.Server.Client.ApiClient +: Tgstation.Server.Client.ApiClient , Tgstation.Server.Client.IApiClient
  • Create< TResult >() -: Tgstation.Server.Client.ApiClient +: Tgstation.Server.Client.ApiClient , Tgstation.Server.Client.IApiClient
  • CreateApiClient() @@ -433,7 +423,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • CreateClient() : Tgstation.Server.Client.IInstanceManagerClient , Tgstation.Server.Client.InstanceManagerClient -, Tgstation.Server.Host.Core.GitHubClientFactory +, Tgstation.Server.Host.Core.GitHubClientFactory , Tgstation.Server.Host.Core.IGitHubClientFactory
  • CreateConnection() @@ -465,9 +455,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.IO.ISynchronousIOManager , Tgstation.Server.Host.IO.SynchronousIOManager
  • -
  • CreateFactory() -: Tgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactory -
  • CreateFromExistingHandle() : Tgstation.Server.Host.System.ProcessExecutor
  • @@ -508,8 +495,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.ServerFactory
  • CreateServerClient() -: Tgstation.Server.Client.IServerClientFactory -, Tgstation.Server.Client.ServerClientFactory +: Tgstation.Server.Client.IServerClientFactory +, Tgstation.Server.Client.ServerClientFactory
  • CreateSymbolicLink() : Tgstation.Server.Host.IO.ISymlinkFactory @@ -522,9 +509,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Security.PosixSystemIdentityFactory , Tgstation.Server.Host.Security.WindowsSystemIdentityFactory
  • -
  • CreateTestInstance() -: Tgstation.Server.Tests.InstanceManagerTest -
  • CreateToken() : Tgstation.Server.Host.Controllers.HomeController , Tgstation.Server.Host.Security.ITokenFactory diff --git a/functions_func_d.html b/functions_func_d.html index 0337460e2c..ec876b6770 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -202,9 +202,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Deployment.DreamMaker , Tgstation.Server.Host.Components.Deployment.IDreamMaker
  • -
  • DeployTestDme() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • Describe() : Tgstation.Server.Api.Models.ErrorCodeExtensions
  • @@ -275,7 +272,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.System.Process , Tgstation.Server.Host.System.ProgramShutdownTokenSource , Tgstation.Server.Host.System.WindowsNetworkPromptReaper -, Tgstation.Server.Tests.TestingServer
  • DisposeAndNullControllers() : Tgstation.Server.Host.Components.Watchdog.BasicWatchdog @@ -358,10 +354,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Controllers.DreamMakerController
  • DualReattachInformation() -: Tgstation.Server.Host.Components.Session.DualReattachInformation +: Tgstation.Server.Host.Components.Session.DualReattachInformation
  • DualReattachInformationBase() -: Tgstation.Server.Host.Models.DualReattachInformationBase +: Tgstation.Server.Host.Models.DualReattachInformationBase
  • diff --git a/functions_func_e.html b/functions_func_e.html index ef6755babd..0a1f87c085 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_func_f.html b/functions_func_f.html index 1ceae029f0..c89402d811 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -143,7 +143,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • FileExists() : Tgstation.Server.Host.IO.DefaultIOManager , Tgstation.Server.Host.IO.IIOManager -, Tgstation.Server.Tests.Instance.ConfigurationTest
  • FindWindow() : Tgstation.Server.Host.NativeMethods diff --git a/functions_func_g.html b/functions_func_g.html index a558715f11..ea9a45e35e 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -310,9 +310,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GitHubClientFactory() : Tgstation.Server.Host.Core.GitHubClientFactory
  • -
  • GracefulWatchdogShutdown() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • diff --git a/functions_func_h.html b/functions_func_h.html index 01c0a614d9..8ae5d118c3 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -172,9 +172,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.IO.PosixPostWriteHandler , Tgstation.Server.Host.IO.WindowsPostWriteHandler -
  • HasPermissionToMakeSymlinks() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • Home() : Tgstation.Server.Host.Controllers.HomeController
  • diff --git a/functions_func_i.html b/functions_func_i.html index 8e88b4e672..a7d7c72fb6 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -138,18 +138,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • InfiniteTask() : Tgstation.Server.Host.Extensions.TaskExtensions
  • -
  • Init() -: Tgstation.Server.Host.System.Tests.TestProcessFeatures -, Tgstation.Server.Tests.VersionsTest -
  • InitControllers() : Tgstation.Server.Host.Components.Watchdog.BasicWatchdog , Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog , Tgstation.Server.Host.Components.Watchdog.WatchdogBase
  • Initialize() -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -, Tgstation.Server.Host.Database.DatabaseContext< TParentContext > +: Tgstation.Server.Host.Database.DatabaseContext< TParentContext > , Tgstation.Server.Host.Database.IDatabaseContext
  • InjectClaimsIntoContext() @@ -191,16 +186,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • InstanceManagerClient() : Tgstation.Server.Client.InstanceManagerClient
  • -
  • InstanceManagerTest() -: Tgstation.Server.Tests.InstanceManagerTest -
  • InstanceRenamed() : Tgstation.Server.Host.Components.Interop.Bridge.IBridgeHandler , Tgstation.Server.Host.Components.Session.SessionController
  • -
  • InstanceTest() -: Tgstation.Server.Tests.Instance.InstanceTest -
  • InstanceUser() : Tgstation.Server.Client.Components.InstanceUserClient
  • @@ -211,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Controllers.InstanceUserController
  • InsufficientPermissionsException() -: Tgstation.Server.Client.InsufficientPermissionsException +: Tgstation.Server.Client.InsufficientPermissionsException
  • Invoke() : Tgstation.Server.Host.Components.Chat.Commands.ByondCommand @@ -223,7 +212,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.Chat.Commands.VersionCommand
  • IrcConnectionStringBuilder() -: Tgstation.Server.Api.Models.IrcConnectionStringBuilder +: Tgstation.Server.Api.Models.IrcConnectionStringBuilder
  • IrcProvider() : Tgstation.Server.Host.Components.Chat.Providers.IrcProvider diff --git a/functions_func_j.html b/functions_func_j.html index 9707841fca..921a95c8ab 100644 --- a/functions_func_j.html +++ b/functions_func_j.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -148,9 +148,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • JobsClient() : Tgstation.Server.Client.Components.JobsClient
  • -
  • JobsRequiredTest() -: Tgstation.Server.Tests.Instance.JobsRequiredTest -
  • diff --git a/functions_func_k.html b/functions_func_k.html index 2f5c9b23cf..d19b99de4b 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_func_l.html b/functions_func_l.html index 5aabc764f5..579dd05651 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_func_m.html b/functions_func_m.html index e4a7a000b1..2a3d436670 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -130,8 +130,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - m -

    diff --git a/functions_h.html b/functions_h.html index be33108c18..a2da1ed5ca 100644 --- a/functions_h.html +++ b/functions_h.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -183,19 +182,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.IO.PosixPostWriteHandler , Tgstation.Server.Host.IO.WindowsPostWriteHandler -
  • HasPermissionToMakeSymlinks() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • Head : Tgstation.Server.Host.Components.Repository.IRepository , Tgstation.Server.Host.Components.Repository.Repository
  • +
  • Headers +: Tgstation.Server.Client.ApiClient +
  • headers : Tgstation.Server.Client.ApiClient
  • Headers -: Tgstation.Server.Client.ApiClient -, Tgstation.Server.Client.IApiClient +: Tgstation.Server.Client.IApiClient
  • HeadIncludeLine : Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications diff --git a/functions_i.html b/functions_i.html index 213600663f..cf93425cac 100644 --- a/functions_i.html +++ b/functions_i.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -173,18 +172,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • InfiniteTask() : Tgstation.Server.Host.Extensions.TaskExtensions
  • -
  • Init() -: Tgstation.Server.Host.System.Tests.TestProcessFeatures -, Tgstation.Server.Tests.VersionsTest -
  • InitControllers() : Tgstation.Server.Host.Components.Watchdog.BasicWatchdog , Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog , Tgstation.Server.Host.Components.Watchdog.WatchdogBase
  • Initialize() -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -, Tgstation.Server.Host.Database.DatabaseContext< TParentContext > +: Tgstation.Server.Host.Database.DatabaseContext< TParentContext > , Tgstation.Server.Host.Database.IDatabaseContext
  • InjectClaimsIntoContext() @@ -255,9 +249,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.RepositorySettings , Tgstation.Server.Host.Models.RevisionInformation
  • -
  • instance -: Tgstation.Server.Tests.Instance.ConfigurationTest -
  • InstanceAdminUser() : Tgstation.Server.Host.Controllers.InstanceController
  • @@ -267,11 +258,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • InstanceClient() : Tgstation.Server.Client.Components.InstanceClient
  • -
  • instanceClient -: Tgstation.Server.Tests.Instance.ChatTest -, Tgstation.Server.Tests.Instance.InstanceTest -, Tgstation.Server.Tests.Instance.WatchdogTest -
  • InstanceController() : Tgstation.Server.Host.Controllers.InstanceController
  • @@ -313,16 +299,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • InstanceManagerClient() : Tgstation.Server.Client.InstanceManagerClient
  • -
  • instanceManagerClient -: Tgstation.Server.Tests.Instance.InstanceTest -, Tgstation.Server.Tests.InstanceManagerTest -
  • InstanceManagerRights : Tgstation.Server.Api.Models.Internal.User
  • -
  • InstanceManagerTest() -: Tgstation.Server.Tests.InstanceManagerTest -
  • InstanceName : Tgstation.Server.Host.Components.Interop.Bridge.RuntimeInformation
  • @@ -344,9 +323,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • instancesCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • InstanceTest() -: Tgstation.Server.Tests.Instance.InstanceTest -
  • InstanceUser : Tgstation.Server.Api.Routes , Tgstation.Server.Client.Components.InstanceUserClient @@ -372,7 +348,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • InsufficientPermissionsException() -: Tgstation.Server.Client.InsufficientPermissionsException +: Tgstation.Server.Client.InsufficientPermissionsException
  • InteropResponse : Tgstation.Server.Host.Components.Session.CombinedTopicResponse @@ -429,7 +405,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Api.Models.ChatChannel
  • IrcConnectionStringBuilder() -: Tgstation.Server.Api.Models.IrcConnectionStringBuilder +: Tgstation.Server.Api.Models.IrcConnectionStringBuilder
  • IrcProvider() : Tgstation.Server.Host.Components.Chat.Providers.IrcProvider diff --git a/functions_j.html b/functions_j.html index 69cf7a175c..f0cc59ce41 100644 --- a/functions_j.html +++ b/functions_j.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -178,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Api.Routes , Tgstation.Server.Client.Components.IInstanceClient , Tgstation.Server.Client.Components.InstanceClient -, Tgstation.Server.Host.Database.DatabaseContext< TParentContext > +, Tgstation.Server.Host.Database.DatabaseContext< TParentContext > , Tgstation.Server.Host.Database.IDatabaseContext
  • jobs @@ -189,14 +188,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • JobsClient() : Tgstation.Server.Client.Components.JobsClient -, Tgstation.Server.Tests.Instance.JobsRequiredTest
  • jobsCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • JobsRequiredTest() -: Tgstation.Server.Tests.Instance.JobsRequiredTest -
  • JwtAuthenticationScheme : Tgstation.Server.Api.ApiHeaders
  • diff --git a/functions_k.html b/functions_k.html index 3e490ba989..923399e86b 100644 --- a/functions_k.html +++ b/functions_k.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/functions_l.html b/functions_l.html index 358e340e4f..3c53984837 100644 --- a/functions_l.html +++ b/functions_l.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/functions_m.html b/functions_m.html index 470742dc46..a7b807cd4d 100644 --- a/functions_m.html +++ b/functions_m.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -132,8 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - m -

    diff --git a/functions_o.html b/functions_o.html index 0af3a9b7ed..b75d886f5b 100644 --- a/functions_o.html +++ b/functions_o.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/functions_p.html b/functions_p.html index 1c8e155f77..7deaad42aa 100644 --- a/functions_p.html +++ b/functions_p.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -247,7 +246,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.System.PosixProcessFeatures
  • PostDeploymentComments() -: Tgstation.Server.Host.Components.Deployment.DreamMaker +: Tgstation.Server.Host.Components.Deployment.DreamMaker
  • PostSetupServices() : Tgstation.Server.Host.Setup.PostSetupServices @@ -323,8 +322,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Chat.ChatManager
  • productHeaderValue -: Tgstation.Server.Api.Tests.TestApiHeaders -, Tgstation.Server.Client.ServerClientFactory +: Tgstation.Server.Client.ServerClientFactory
  • ProgramShutdownTokenSource() : Tgstation.Server.Host.System.ProgramShutdownTokenSource diff --git a/functions_prop.html b/functions_prop.html index 3cc0ec287b..2a6a37a85f 100644 --- a/functions_prop.html +++ b/functions_prop.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_b.html b/functions_prop_b.html index 3665192bfc..abdeb3b1f1 100644 --- a/functions_prop_b.html +++ b/functions_prop_b.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_c.html b/functions_prop_c.html index 140081d754..bf2d12ff0b 100644 --- a/functions_prop_c.html +++ b/functions_prop_c.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_d.html b/functions_prop_d.html index 342e2fc20f..19d4decae9 100644 --- a/functions_prop_d.html +++ b/functions_prop_d.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -139,7 +139,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • DatabaseType : Tgstation.Server.Host.Configuration.DatabaseConfiguration , Tgstation.Server.Host.Database.IDatabaseContext -, Tgstation.Server.Tests.TestingServer
  • Debug : Tgstation.Server.Host.Service.Program @@ -152,7 +151,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Directory : Tgstation.Server.Host.Configuration.FileLoggingConfiguration -, Tgstation.Server.Tests.TestingServer
  • DirectoryName : Tgstation.Server.Api.Models.Internal.CompileJob @@ -246,9 +244,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • DropDatabase : Tgstation.Server.Host.Configuration.DatabaseConfiguration
  • -
  • DumpOpenApiSpecpath -: Tgstation.Server.Tests.TestingServer -
  • diff --git a/functions_prop_e.html b/functions_prop_e.html index dda5dfd944..807cb3456f 100644 --- a/functions_prop_e.html +++ b/functions_prop_e.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_f.html b/functions_prop_f.html index 08f672ea64..34bdc2f5d7 100644 --- a/functions_prop_f.html +++ b/functions_prop_f.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_g.html b/functions_prop_g.html index ff788062d7..dbcc3013e0 100644 --- a/functions_prop_g.html +++ b/functions_prop_g.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_h.html b/functions_prop_h.html index f813e60033..1c0e04bb43 100644 --- a/functions_prop_h.html +++ b/functions_prop_h.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_i.html b/functions_prop_i.html index 750ec582e3..6ea16f74c0 100644 --- a/functions_prop_i.html +++ b/functions_prop_i.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_j.html b/functions_prop_j.html index a865e11de9..6651f3ec46 100644 --- a/functions_prop_j.html +++ b/functions_prop_j.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -143,9 +143,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Database.IDatabaseContext , Tgstation.Server.Host.Models.Instance -
  • JobsClient -: Tgstation.Server.Tests.Instance.JobsRequiredTest -
  • diff --git a/functions_prop_l.html b/functions_prop_l.html index 5252ed6f27..7a68e41261 100644 --- a/functions_prop_l.html +++ b/functions_prop_l.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_m.html b/functions_prop_m.html index fa80abead5..2f50e8f943 100644 --- a/functions_prop_m.html +++ b/functions_prop_m.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_n.html b/functions_prop_n.html index e06a9f7f46..e2a6144de2 100644 --- a/functions_prop_n.html +++ b/functions_prop_n.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_o.html b/functions_prop_o.html index bf6c0dc9da..fe85b8bba0 100644 --- a/functions_prop_o.html +++ b/functions_prop_o.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_p.html b/functions_prop_p.html index 982c02b0b9..1157c5693f 100644 --- a/functions_prop_p.html +++ b/functions_prop_p.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_r.html b/functions_prop_r.html index 35163db89e..1330253a5e 100644 --- a/functions_prop_r.html +++ b/functions_prop_r.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_s.html b/functions_prop_s.html index 2f2fd68fd6..efe0acb0d5 100644 --- a/functions_prop_s.html +++ b/functions_prop_s.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_t.html b/functions_prop_t.html index fc03cfa913..90a5248690 100644 --- a/functions_prop_t.html +++ b/functions_prop_t.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_u.html b/functions_prop_u.html index 3a9c44277b..9092edd30e 100644 --- a/functions_prop_u.html +++ b/functions_prop_u.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -138,15 +138,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • UpdatePackageAssetName : Tgstation.Server.Host.Configuration.UpdatesConfiguration
  • -
  • UpdatePath -: Tgstation.Server.Tests.TestingServer -
  • Url : Tgstation.Server.Api.Models.Internal.TestMergeBase , Tgstation.Server.Client.ApiClient , Tgstation.Server.Client.IApiClient , Tgstation.Server.Client.IServerClient -, Tgstation.Server.Tests.TestingServer
  • UseBasicWatchdogOnWindows : Tgstation.Server.Host.Configuration.GeneralConfiguration diff --git a/functions_prop_v.html b/functions_prop_v.html index a048083420..1a8a2e9f66 100644 --- a/functions_prop_v.html +++ b/functions_prop_v.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_prop_w.html b/functions_prop_w.html index b93d855b79..40728a152e 100644 --- a/functions_prop_w.html +++ b/functions_prop_w.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/functions_q.html b/functions_q.html index 58163833c0..15d5533b15 100644 --- a/functions_q.html +++ b/functions_q.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/functions_r.html b/functions_r.html index a2f1e201d2..c018d65ac5 100644 --- a/functions_r.html +++ b/functions_r.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -203,9 +202,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Chat.ChannelRepresentation , Tgstation.Server.Host.Components.Chat.ChatUser -
  • realServer -: Tgstation.Server.Tests.TestingServer -
  • Reattach() : Tgstation.Server.Host.Components.Session.ISessionControllerFactory , Tgstation.Server.Host.Components.Session.SessionControllerFactory @@ -345,9 +341,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • RepositoryClient() : Tgstation.Server.Client.Components.RepositoryClient
  • -
  • repositoryClient -: Tgstation.Server.Tests.Instance.RepositoryTest -
  • repositoryCommands : Tgstation.Server.Host.Components.InstanceFactory
  • @@ -383,14 +376,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • repositorySettingsCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • RepositoryTest() -: Tgstation.Server.Tests.Instance.RepositoryTest -
  • requestLoggers : Tgstation.Server.Client.ApiClient
  • RequestTimeoutException() -: Tgstation.Server.Client.RequestTimeoutException +: Tgstation.Server.Client.RequestTimeoutException
  • requireHeaders : Tgstation.Server.Host.Controllers.ApiController @@ -420,7 +410,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.Repository.Repository
  • ResolvePath() -: Tgstation.Server.Host.IO.DefaultIOManager +: Tgstation.Server.Host.IO.DefaultIOManager , Tgstation.Server.Host.IO.IIOManager , Tgstation.Server.Host.IO.ResolvingIOManager
  • @@ -457,7 +447,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • RestartRequested : Tgstation.Server.Host.IServer , Tgstation.Server.Host.Server -, Tgstation.Server.Tests.TestingServer
  • RestartTimeout : Tgstation.Server.Host.Configuration.GeneralConfiguration @@ -496,7 +485,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.RevInfoTestMerge
  • RevisionInformations -: Tgstation.Server.Host.Database.DatabaseContext< TParentContext > +: Tgstation.Server.Host.Database.DatabaseContext< TParentContext > , Tgstation.Server.Host.Database.IDatabaseContext , Tgstation.Server.Host.Models.Instance
  • @@ -525,52 +514,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.IServer , Tgstation.Server.Host.Server , Tgstation.Server.Host.System.WindowsNetworkPromptReaper -, Tgstation.Server.Tests.AdministrationTest -, Tgstation.Server.Tests.Instance.ByondTest -, Tgstation.Server.Tests.Instance.ConfigurationTest -, Tgstation.Server.Tests.Instance.WatchdogTest -, Tgstation.Server.Tests.TestingServer -, Tgstation.Server.Tests.UsersTest
  • RunAsync() : Tgstation.Server.Host.Watchdog.IWatchdog , Tgstation.Server.Host.Watchdog.Watchdog
  • -
  • RunBasicTest() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • RunCompileJob() : Tgstation.Server.Host.Components.Deployment.DreamMaker
  • -
  • RunDiscord() -: Tgstation.Server.Tests.Instance.ChatTest -
  • RunDreamMaker() : Tgstation.Server.Host.Components.Deployment.DreamMaker
  • -
  • RunHeartbeatTest() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • RunImpersonated() : Tgstation.Server.Host.Security.ISystemIdentity , Tgstation.Server.Host.Security.PosixSystemIdentity , Tgstation.Server.Host.Security.WindowsSystemIdentity
  • -
  • RunIrc() -: Tgstation.Server.Tests.Instance.ChatTest -
  • RunJob() : Tgstation.Server.Host.Jobs.JobManager
  • -
  • RunLimitTests() -: Tgstation.Server.Tests.Instance.ChatTest -
  • -
  • RunLongRunningTestThenUpdate() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • -
  • RunLongRunningTestThenUpdateWithByondVersionSwitch() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • Running : Tgstation.Server.Api.Models.DreamDaemon , Tgstation.Server.Host.Components.Watchdog.IWatchdog @@ -579,27 +541,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • running : Tgstation.Server.Host.Components.Watchdog.WatchdogBase
  • -
  • RunPostTest() -: Tgstation.Server.Tests.Instance.ChatTest -, Tgstation.Server.Tests.Instance.RepositoryTest -, Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • RunPreInstanceTest() -: Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • RunPreWatchdog() -: Tgstation.Server.Tests.Instance.ChatTest -, Tgstation.Server.Tests.Instance.RepositoryTest -
  • RunRequest< TResult >() : Tgstation.Server.Client.ApiClient
  • runTask : Tgstation.Server.Host.System.WindowsNetworkPromptReaper
  • -
  • RunTests() -: Tgstation.Server.Tests.Instance.InstanceTest -
  • RuntimeInformation : Tgstation.Server.Host.Components.Interop.Bridge.BridgeResponse , Tgstation.Server.Host.Components.Interop.Bridge.RuntimeInformation diff --git a/functions_s.html b/functions_s.html index 902cb839f2..dbd7c675b0 100644 --- a/functions_s.html +++ b/functions_s.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -173,9 +172,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Configuration.FileLoggingConfiguration , Tgstation.Server.Host.Configuration.GeneralConfiguration , Tgstation.Server.Host.Configuration.UpdatesConfiguration -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig1 -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig2 -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.GoodConfig
  • SecureStringLength : Tgstation.Server.Host.Security.CryptographySuite @@ -194,9 +190,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Database.DatabaseSeeder , Tgstation.Server.Host.Database.IDatabaseSeeder
  • -
  • SelectFactory() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • semaphore : Tgstation.Server.Host.Components.Byond.ByondManager , Tgstation.Server.Host.Components.Byond.WindowsByondInstaller @@ -406,9 +399,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Client.Components.DreamDaemonClient , Tgstation.Server.Client.Components.IDreamDaemonClient
  • -
  • StartAndLeaveRunning() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • StartAsync() : Tgstation.Server.Host.Components.Byond.ByondManager , Tgstation.Server.Host.Components.Chat.ChatManager @@ -454,9 +444,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • StaticIgnorePath() : Tgstation.Server.Host.Components.StaticFiles.Configuration
  • -
  • StopApplication() -: Tgstation.Server.Host.Core.Tests.TestApplication.MockHostApplicationLifetime -
  • StopAsync() : Tgstation.Server.Host.Components.Byond.ByondManager , Tgstation.Server.Host.Components.Chat.ChatManager @@ -506,7 +493,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.StaticFiles.Configuration , Tgstation.Server.Host.Components.Watchdog.WindowsWatchdog , Tgstation.Server.Host.Components.Watchdog.WindowsWatchdogFactory -, Tgstation.Server.Host.IO.Tests.TestSymlinkFactory
  • SymlinkStaticFilesTo() : Tgstation.Server.Host.Components.StaticFiles.Configuration diff --git a/functions_t.html b/functions_t.html index 98d7521003..b020fc2738 100644 --- a/functions_t.html +++ b/functions_t.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -142,9 +141,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Jobs.JobHandler , Tgstation.Server.Host.Security.IdentityCacheObject -
  • TellWorldToReboot() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • TemporaryDmbProvider() : Tgstation.Server.Host.Components.Deployment.TemporaryDmbProvider
  • @@ -154,9 +150,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.System.IProcess , Tgstation.Server.Host.System.Process -
  • TerminateAllDDs() -: Tgstation.Server.Tests.IntegrationTest -
  • TerminateNoLock() : Tgstation.Server.Host.Components.Watchdog.WatchdogBase
  • @@ -165,147 +158,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.Session.ISessionController , Tgstation.Server.Host.Components.Session.SessionController -
  • TestAllErrorCodesHaveDescriptions() -: Tgstation.Server.Api.Models.Tests.TestErrorCodeExtensions -
  • -
  • TestAllPowerOfTwo() -: Tgstation.Server.Api.Rights.Tests.TestRights -
  • -
  • TestAllRightsWorks() -: Tgstation.Server.Api.Rights.Tests.TestRights -
  • -
  • TestApiVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestBadParameters() -: Tgstation.Server.Host.Database.Tests.TestDatabaseConnectionFactory -
  • -
  • TestBasicParseAndBuild() -: Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder -
  • -
  • TestCacheClean() -: Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller -
  • -
  • TestCancel() -: Tgstation.Server.Host.Core.Tests.TestAsyncDelayer -
  • -
  • TestCancellation() -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • -
  • TestClientVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestCloning() -: Tgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactory -
  • -
  • TestConnectAndDisconnect() -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -
  • -
  • TestConnectWithFakeTokenFails() -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -
  • -
  • TestConstruction() -: Tgstation.Server.Api.Tests.TestApiHeaders -, Tgstation.Server.Client.Tests.TestServerClientFactory -, Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller -, Tgstation.Server.Host.Jobs.Tests.TestJobException -, Tgstation.Server.Host.Security.Tests.TestAuthenticationContext -, Tgstation.Server.Host.Watchdog.Tests.TestWatchdog -
  • -
  • TestConstructionAndDisposal() -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -, Tgstation.Server.Host.Jobs.Tests.TestJobHandler -, Tgstation.Server.Host.Service.Tests.TestServerService -
  • -
  • TestConstructionThrows() -: Tgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactory -, Tgstation.Server.Host.Database.Tests.TestDatabaseContextFactory -, Tgstation.Server.Host.Setup.Tests.TestSetupWizard -
  • -
  • TestControlPanelVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestContruction() -: Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory -
  • -
  • TestContructor() -: Tgstation.Server.Host.Tests.TestServerFactory -
  • -
  • TestCoreVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestCorrectPlatform() -: Tgstation.Server.Host.System.Tests.TestPlatformIdentifier -
  • -
  • TestCreateBasicClient() -: Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory -
  • -
  • TestCreateSysUser() -: Tgstation.Server.Tests.UsersTest -
  • -
  • TestCreateTokenClient() -: Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory -
  • -
  • TestCreateWatchdog() -: Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory -
  • TestDatabaseConnection() : Tgstation.Server.Host.Setup.SetupWizard
  • -
  • TestDelay() -: Tgstation.Server.Host.Core.Tests.TestAsyncDelayer -
  • -
  • TestDeleteDirectory() -: Tgstation.Server.Tests.Instance.ConfigurationTest -
  • -
  • TestDeserializingByondModelsWork() -: Tgstation.Server.Client.Tests.TestApiClient -
  • -
  • TestDirectoryWorks() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • -
  • TestDmapiVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestDownload() -: Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller -
  • -
  • TestFailsProperly() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • -
  • TestFileWorks() -: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory -
  • -
  • TestGetRightsGeneric() -: Tgstation.Server.Host.Security.Tests.TestAuthenticationContext -
  • -
  • TestGetUsername() -: Tgstation.Server.Host.System.Tests.TestProcessFeatures -
  • -
  • TestIncompatibleWatchdog() -: Tgstation.Server.Host.Tests.TestProgram -
  • -
  • TestingServer() -: Tgstation.Server.Tests.TestingServer -
  • -
  • TestInMemoryRepoCreation() -: Tgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactory -
  • -
  • TestInstallByond() -: Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller -
  • -
  • TestInstallFakeVersion() -: Tgstation.Server.Tests.Instance.ByondTest -
  • -
  • TestInstallStable() -: Tgstation.Server.Tests.Instance.ByondTest -
  • -
  • TestInstanceName -: Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • TestJob() -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • TestMerge : Tgstation.Server.Host.Models.RevInfoTestMerge
  • @@ -320,124 +175,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Database.DatabaseContext< TParentContext > , Tgstation.Server.Host.Models.User -
  • TestMergeTests() -: Tgstation.Server.Tests.Instance.RepositoryTest -
  • -
  • TestMethodThrows() -: Tgstation.Server.Host.Core.Tests.TestApplication -
  • -
  • TestNoVersion() -: Tgstation.Server.Tests.Instance.ByondTest -
  • -
  • TestPostWrite() -: Tgstation.Server.Host.IO.Tests.TestPostWriteHandler -
  • -
  • TestProgramRuns() -: Tgstation.Server.Host.Console.Tests.TestProgram -
  • -
  • TestProgress() -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • -
  • TestRead() -: Tgstation.Server.Tests.AdministrationTest -
  • -
  • TestRepoLoading() -: Tgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactory -
  • -
  • TestRetrieveCurrentUser() -: Tgstation.Server.Tests.UsersTest -
  • -
  • testRootPath -: Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • TestRun() -: Tgstation.Server.Host.Service.Tests.TestServerService -
  • -
  • TestScriptExecution() -: Tgstation.Server.Tests.IntegrationTest -
  • -
  • TestServer() -: Tgstation.Server.Tests.IntegrationTest -
  • -
  • TestSpamCreation() -: Tgstation.Server.Tests.UsersTest -
  • -
  • TestStandardRun() -: Tgstation.Server.Host.Tests.TestProgram -
  • -
  • TestStandardRunWithException() -: Tgstation.Server.Host.Tests.TestProgram -
  • -
  • TestStandardRunWithExceptionAndWatchdog() -: Tgstation.Server.Host.Tests.TestProgram -
  • -
  • TestStandardRunWithRestart() -: Tgstation.Server.Host.Tests.TestProgram -
  • -
  • TestStart() -: Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient -
  • -
  • TestThrowsOnUnix() -: Tgstation.Server.Host.IO.Tests.TestPostWriteHandler -
  • -
  • TestThrowsWithNullArg() -: Tgstation.Server.Host.IO.Tests.TestPostWriteHandler -
  • -
  • testToken1 -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -
  • -
  • TestUnrecognizedResponse() -: Tgstation.Server.Client.Tests.TestApiClient -
  • -
  • TestUpdateProtocol() -: Tgstation.Server.Tests.IntegrationTest -
  • -
  • TestUserAgentsAreValid() -: Tgstation.Server.Api.Tests.TestApiHeaders -
  • -
  • TestUserInteractive() -: Tgstation.Server.Host.IO.Tests.TestConsole -
  • -
  • TestUseStandardConfig() -: Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions -
  • -
  • TestWait() -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • -
  • TestWatchdogClientVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestWatchdogVersion() -: Tgstation.Server.Tests.VersionsTest -
  • -
  • TestWithUserStupiditiy() -: Tgstation.Server.Host.Setup.Tests.TestSetupWizard -
  • -
  • TestWorks() -: Tgstation.Server.Host.Database.Tests.TestDatabaseConnectionFactory -, Tgstation.Server.Host.Database.Tests.TestDatabaseContextFactory -
  • -
  • TestWorksWithoutUpdatePath() -: Tgstation.Server.Host.Tests.TestServerFactory -
  • -
  • TestWorksWithUpdatePath() -: Tgstation.Server.Host.Tests.TestServerFactory -
  • -
  • TestWriteLine() -: Tgstation.Server.Host.IO.Tests.TestConsole -
  • Text : Tgstation.Server.Host.Components.Interop.ChatMessage
  • TgsAuthorizeAttribute() -: Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute +: Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute
  • ThreadAccess : Tgstation.Server.Host.NativeMethods
  • -
  • ThrowsException< TApiException >() -: Tgstation.Server.Tests.ApiAssert -
  • TimeMerged : Tgstation.Server.Host.Components.Interop.Bridge.TestMergeInformation
  • @@ -521,7 +267,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Interop.DMApiConstants
  • TopicParameters() -: Tgstation.Server.Host.Components.Interop.Topic.TopicParameters +: Tgstation.Server.Host.Components.Interop.Topic.TopicParameters
  • ToString() : Tgstation.Server.Api.Models.DiscordConnectionStringBuilder diff --git a/functions_u.html b/functions_u.html index 5dfda2b619..1b2295f184 100644 --- a/functions_u.html +++ b/functions_u.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -239,9 +238,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • updatePath : Tgstation.Server.Host.Server
  • -
  • UpdatePath -: Tgstation.Server.Tests.TestingServer -
  • updatesConfiguration : Tgstation.Server.Host.Controllers.AdministrationController
  • @@ -254,7 +250,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Client.IApiClient , Tgstation.Server.Client.IServerClient , Tgstation.Server.Client.ServerClient -, Tgstation.Server.Tests.TestingServer
  • UseApplication() : Tgstation.Server.Host.Extensions.WebHostBuilderExtensions @@ -322,15 +317,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • UsersClient() : Tgstation.Server.Client.UsersClient
  • -
  • usersClient -: Tgstation.Server.Tests.InstanceManagerTest -
  • usersCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • UsersTest() -: Tgstation.Server.Tests.UsersTest -
  • UseServerErrorHandling() : Tgstation.Server.Host.Extensions.ApplicationBuilderExtensions
  • diff --git a/functions_v.html b/functions_v.html index 2dffcd6164..543aa4076a 100644 --- a/functions_v.html +++ b/functions_v.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -190,9 +189,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.System.AssemblyInformationProvider , Tgstation.Server.Host.System.IAssemblyInformationProvider -
  • versionsPropertyGroup -: Tgstation.Server.Tests.VersionsTest -
  • VersionString : Tgstation.Server.Host.System.AssemblyInformationProvider , Tgstation.Server.Host.System.IAssemblyInformationProvider diff --git a/functions_vars.html b/functions_vars.html index c2004f14bf..8bf3f2d11d 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -210,18 +209,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • applicationLifetime : Tgstation.Server.Host.Setup.SetupWizard
  • -
  • ApplicationStarted -: Tgstation.Server.Host.Core.Tests.TestApplication.MockHostApplicationLifetime -
  • -
  • ApplicationStopped -: Tgstation.Server.Host.Core.Tests.TestApplication.MockHostApplicationLifetime -
  • -
  • ApplicationStopping -: Tgstation.Server.Host.Core.Tests.TestApplication.MockHostApplicationLifetime -
  • -
  • args -: Tgstation.Server.Tests.TestingServer -
  • assemblyInformationProvider : Tgstation.Server.Host.Components.Chat.Commands.CommandFactory , Tgstation.Server.Host.Components.Chat.Commands.VersionCommand diff --git a/functions_vars_b.html b/functions_vars_b.html index 6eab54bae3..81afccf411 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -175,9 +174,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Deployment.DreamMaker , Tgstation.Server.Host.Components.Session.SessionControllerFactory -
  • byondClient -: Tgstation.Server.Tests.Instance.ByondTest -
  • ByondConfigDir : Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
  • diff --git a/functions_vars_c.html b/functions_vars_c.html index f1757858c7..7fb6b0bff3 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -152,9 +151,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.System.ProgramShutdownTokenSource , Tgstation.Server.Host.System.WindowsNetworkPromptReaper -
  • cancelled -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • CanCreateSymlinks : Tgstation.Server.Host.Security.PosixSystemIdentity , Tgstation.Server.Host.Security.WindowsSystemIdentity @@ -194,9 +190,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • chatChannelsCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • chatClient -: Tgstation.Server.Tests.Instance.ChatTest -
  • chatFactory : Tgstation.Server.Host.Components.InstanceFactory
  • @@ -218,11 +211,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • client : Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider , Tgstation.Server.Host.Components.Chat.Providers.IrcProvider -, Tgstation.Server.Tests.AdministrationTest -, Tgstation.Server.Tests.UsersTest -
  • -
  • clientFactory -: Tgstation.Server.Tests.IntegrationTest
  • CodeModificationsHeadFile : Tgstation.Server.Host.Components.StaticFiles.Configuration @@ -271,9 +259,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Deployment.DreamMaker , Tgstation.Server.Host.Components.EventConsumer
  • -
  • configurationClient -: Tgstation.Server.Tests.Instance.ConfigurationTest -
  • ConfigurationFile : Tgstation.Server.Api.Routes
  • @@ -303,9 +288,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • CurrentDirectory : Tgstation.Server.Host.IO.DefaultIOManager
  • -
  • currentWaitTask -: Tgstation.Server.Host.Jobs.Tests.TestJobHandler -
  • customCommandHandler : Tgstation.Server.Host.Components.Chat.ChatManager , Tgstation.Server.Host.Components.Chat.ChatTrackingContext diff --git a/functions_vars_d.html b/functions_vars_d.html index 770b986c3c..ab9a0031a0 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_e.html b/functions_vars_e.html index c308bca4a2..ba053e9f03 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_f.html b/functions_vars_f.html index 211c939c1d..e8b7a889da 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -129,9 +128,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - f -

    diff --git a/functions_vars_h.html b/functions_vars_h.html index d72f804799..061faa918e 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_i.html b/functions_vars_i.html index 6384ce0891..3ed333c6da 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -156,16 +155,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.Deployment.DmbFactory , Tgstation.Server.Host.Components.Session.SessionControllerFactory , Tgstation.Server.Host.Components.Watchdog.WatchdogBase -, Tgstation.Server.Tests.Instance.ConfigurationTest
  • InstanceAttachFileName : Tgstation.Server.Host.Controllers.InstanceController
  • -
  • instanceClient -: Tgstation.Server.Tests.Instance.ChatTest -, Tgstation.Server.Tests.Instance.InstanceTest -, Tgstation.Server.Tests.Instance.WatchdogTest -
  • instanceFactory : Tgstation.Server.Host.Components.InstanceManager
  • @@ -184,10 +177,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Controllers.InstanceController , Tgstation.Server.Host.Controllers.RepositoryController -
  • instanceManagerClient -: Tgstation.Server.Tests.Instance.InstanceTest -, Tgstation.Server.Tests.InstanceManagerTest -
  • instances : Tgstation.Server.Host.Components.InstanceManager
  • diff --git a/functions_vars_j.html b/functions_vars_j.html index 51d8882550..5b700bad1b 100644 --- a/functions_vars_j.html +++ b/functions_vars_j.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_k.html b/functions_vars_k.html index b0e6a2c791..560d9de364 100644 --- a/functions_vars_k.html +++ b/functions_vars_k.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_l.html b/functions_vars_l.html index 007cb698ae..35fc4cb392 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_m.html b/functions_vars_m.html index 58361dda7a..9f44fdf0d4 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -146,8 +145,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Deployment.DreamMaker , Tgstation.Server.Host.Components.Instance , Tgstation.Server.Host.Components.Session.ReattachInfoHandler -, Tgstation.Server.Tests.Instance.ByondTest -, Tgstation.Server.Tests.Instance.ChatTest
  • monitorCts : Tgstation.Server.Host.Components.Watchdog.WatchdogBase diff --git a/functions_vars_n.html b/functions_vars_n.html index 517881b1db..fc747dff93 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_o.html b/functions_vars_o.html index 6b00180630..e66d2dcc79 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_p.html b/functions_vars_p.html index e6e4755046..37494a3a1d 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -204,8 +203,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.System.ProcessExecutor
  • productHeaderValue -: Tgstation.Server.Api.Tests.TestApiHeaders -, Tgstation.Server.Client.ServerClientFactory +: Tgstation.Server.Client.ServerClientFactory
  • propagatedException : Tgstation.Server.Host.Server diff --git a/functions_vars_q.html b/functions_vars_q.html index 346e31e2a2..68a8d3af86 100644 --- a/functions_vars_q.html +++ b/functions_vars_q.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_vars_r.html b/functions_vars_r.html index 9e8b075e3e..e2f800e950 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -135,9 +134,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • readyTcs : Tgstation.Server.Host.Components.InstanceManager
  • -
  • realServer -: Tgstation.Server.Tests.TestingServer -
  • reattachInfoHandler : Tgstation.Server.Host.Components.Watchdog.WatchdogBase
  • @@ -194,9 +190,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Repository : Tgstation.Server.Api.Routes
  • -
  • repositoryClient -: Tgstation.Server.Tests.Instance.RepositoryTest -
  • repositoryCommands : Tgstation.Server.Host.Components.InstanceFactory
  • @@ -238,9 +231,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Chat.ChatManager , Tgstation.Server.Host.Components.Watchdog.WatchdogBase -
  • RestartRequested -: Tgstation.Server.Tests.TestingServer -
  • RevisionInformations : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • diff --git a/functions_vars_s.html b/functions_vars_s.html index 176b21d976..d6ccbe7735 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -143,9 +142,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Configuration.FileLoggingConfiguration , Tgstation.Server.Host.Configuration.GeneralConfiguration , Tgstation.Server.Host.Configuration.UpdatesConfiguration -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig1 -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig2 -, Tgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.GoodConfig
  • SecureStringLength : Tgstation.Server.Host.Security.CryptographySuite @@ -197,7 +193,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Components.StaticFiles.Configuration , Tgstation.Server.Host.Components.Watchdog.WindowsWatchdog , Tgstation.Server.Host.Components.Watchdog.WindowsWatchdogFactory -, Tgstation.Server.Host.IO.Tests.TestSymlinkFactory
  • synchronizationLock : Tgstation.Server.Host.Components.Chat.ChatManager diff --git a/functions_vars_t.html b/functions_vars_t.html index fef81bab06..7192d644b0 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -136,15 +135,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • TerminationWasRequested : Tgstation.Server.Host.Components.Session.DeadSessionController
  • -
  • TestInstanceName -: Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • testRootPath -: Tgstation.Server.Tests.InstanceManagerTest -
  • -
  • testToken1 -: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider -
  • TimeoutSeconds : Tgstation.Server.Host.Components.Chat.Providers.IrcProvider
  • diff --git a/functions_vars_u.html b/functions_vars_u.html index e5692cacf1..dd489641a0 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -167,9 +166,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Users : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • -
  • usersClient -: Tgstation.Server.Tests.InstanceManagerTest -
  • usersCollection : Tgstation.Server.Host.Database.DatabaseContext< TParentContext >
  • diff --git a/functions_vars_v.html b/functions_vars_v.html index 644b03b8df..60304a2592 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • @@ -143,9 +142,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • VersionPrefix : Tgstation.Server.Host.System.AssemblyInformationProvider
  • -
  • versionsPropertyGroup -: Tgstation.Server.Tests.VersionsTest -
  • diff --git a/functions_vars_w.html b/functions_vars_w.html index ce5cab520f..510bad535f 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • diff --git a/functions_w.html b/functions_w.html index d3f44ad1b4..f0281f638d 100644 --- a/functions_w.html +++ b/functions_w.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • @@ -134,16 +133,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Wait() : Tgstation.Server.Host.Jobs.JobHandler
  • -
  • WaitForJob() -: Tgstation.Server.Tests.Instance.JobsRequiredTest -
  • WaitForJobCompletion() : Tgstation.Server.Host.Jobs.IJobManager , Tgstation.Server.Host.Jobs.JobManager
  • -
  • WaitForJobProgressThenCancel() -: Tgstation.Server.Tests.Instance.JobsRequiredTest -
  • watchdog : Tgstation.Server.Host.Components.Chat.Commands.ByondCommand , Tgstation.Server.Host.Components.Chat.Commands.CommandFactory @@ -188,9 +181,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • watchdogTask : Tgstation.Server.Host.Service.ServerService
  • -
  • WatchdogTest() -: Tgstation.Server.Tests.Instance.WatchdogTest -
  • WindowsByondInstaller() : Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
  • @@ -207,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Tgstation.Server.Host.Components.Deployment.WindowsSwappableDmbProvider
  • WindowsSystemIdentity() -: Tgstation.Server.Host.Security.WindowsSystemIdentity +: Tgstation.Server.Host.Security.WindowsSystemIdentity
  • WindowsSystemIdentityFactory() : Tgstation.Server.Host.Security.WindowsSystemIdentityFactory diff --git a/functions_z.html b/functions_z.html index 34425bf60d..aeb4b1bb63 100644 --- a/functions_z.html +++ b/functions_z.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -107,7 +107,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • u
  • v
  • w
  • -
  • x
  • z
  • ~
  • diff --git a/graph_legend.html b/graph_legend.html index 51dc3a6fbe..2f0c6938d6 100644 --- a/graph_legend.html +++ b/graph_legend.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/hierarchy.html b/hierarchy.html index d4bfb8ab1c..604e59c869 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -98,498 +98,445 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); This inheritance list is sorted roughly, but not completely, alphabetically:
    [detail level 1234]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     CTgstation.Server.Api.Models.AdministrationRepresents administrative server information
     CTgstation.Server.Tests.AdministrationTest
     CTgstation.Server.Tests.ApiAssertExtension methods for the Assert .
     CTgstation.Server.Api.ApiHeadersRepresents the header that must be present for every server request
     CTgstation.Server.Host.Extensions.ApplicationBuilderExtensionsExtensions for IApplicationBuilder
     CAuthorizeAttribute
     CTgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig1
     CTgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig2
     CTgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.BadConfig3
     CTgstation.Server.Api.Models.ByondRepresents a BYOND installation
     CTgstation.Server.Host.Components.Chat.ChannelMappingRepresents a mapping of a ChannelRepresentation.RealId
     CTgstation.Server.Host.Components.Chat.ChannelRepresentationRepresents a Providers.IProvider channel.
     CTgstation.Server.Api.Models.Internal.ChatBotManage the server chat bots
     CTgstation.Server.Api.Models.ChatChannelIndicates a chat channel
     CTgstation.Server.Host.Extensions.ChatChannelExtensionsExtensions for the ChatChannel .
     CTgstation.Server.Host.Components.Interop.Topic.ChatCommandRepresents a chat command to be handled by DD
     CTgstation.Server.Api.Models.Internal.ChatConnectionStringBuilderHelper for building ChatBot.ConnectionStrings
     CTgstation.Server.Host.Components.Interop.ChatMessageRepresents a message to send to one or more Chat.ChannelRepresentations.
     CTgstation.Server.Tests.Instance.ChatTest
     CTgstation.Server.Host.Components.Interop.ChatUpdateRepresents an update of ChannelRepresentations.
     CTgstation.Server.Host.Components.Chat.ChatUserRepresents a tgs_chat_user datum
     CTgstation.Server.Host.Components.Session.CombinedTopicResponseCombines a global::Byond.TopicSender.TopicResponse with a TopicResponse.
     CTgstation.Server.Api.Models.ConfigurationFileRepresents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files
     CTgstation.Server.Tests.Instance.ConfigurationTest
     CController
     CTgstation.Server.Host.Configuration.ControlPanelConfigurationConfiguration options for the web control panel
     CTgstation.Server.Host.Configuration.DatabaseConfigurationConfiguration options for the Database.DatabaseContext<TParentContext>
     CTgstation.Server.Host.Database.DatabaseContext< MySqlDatabaseContext >
     CTgstation.Server.Host.Database.DatabaseContext< SqliteDatabaseContext >
     CTgstation.Server.Host.Database.DatabaseContext< SqlServerDatabaseContext >
     CTgstation.Server.Host.Extensions.DatabaseContextExtensionsExtensions for the IDatabaseContext .
     CDbContext
     CTgstation.Server.Host.Database.Design.DesignTimeDbContextFactoryHelpersContains helpers for creating design time DatabaseContext<TParentContext>s
     CTgstation.Server.Host.Components.Interop.DMApiConstantsConstants used for communication with the DMAPI
     CTgstation.Server.Host.Components.Interop.DMApiParametersCommon base for interop parameters.
     CTgstation.Server.Host.Components.Interop.DMApiResponseCommon base for interop responses.
     CTgstation.Server.Api.Models.Internal.DreamDaemonLaunchParametersLaunch settings for DreamDaemon
     CTgstation.Server.Api.Models.DreamMakerRepresents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile
     CTgstation.Server.Host.Models.DualReattachInformationBaseBase class for DualReattachInformation
     CTgstation.Server.Api.Models.EntityIdCommon base of CompileJobs and Jobs.
     CTgstation.Server.Api.Models.ErrorCodeExtensionsExtension methods for the ErrorCode .
     CTgstation.Server.Api.Models.ErrorMessageRepresents an error message returned by the server
     CTgstation.Server.Host.Components.Interop.Topic.EventNotificationData structure for TopicCommandType.EventNotification requests.
     CTgstation.Server.Host.Configuration.FileLoggingConfigurationFile logging configuration options
     CTgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions.GoodConfig
     CTgstation.Server.Host.Extensions.HostBuilderExtensionsExtension methods for the IHostBuilder .
     CTgstation.Server.Client.IAdministrationClientFor managing server administration
     CTgstation.Server.Client.IApiClientFactoryFor creating IApiClients
     CTgstation.Server.Host.System.IAssemblyInformationProviderFor retrieving the Assembly's location.
     CTgstation.Server.Host.Core.IAsyncDelayerFor waiting asynchronously
     CTgstation.Server.Host.Security.IAuthenticationContextFactoryFor creating and accessing authentication contexts
     CTgstation.Server.Host.Components.Interop.Bridge.IBridgeDispatcherHandler for BridgeParameters.
     CTgstation.Server.Host.Components.Interop.Bridge.IBridgeRegistrarRegisters IBridgeHandlers.
     CTgstation.Server.Client.Components.IByondClientFor managing the Byond installation
     CTgstation.Server.Host.Components.Byond.IByondInstallerFor downloading and installing BYOND extractions for a given system
     CTgstation.Server.Host.Components.Chat.IChannelSinkNotifyee of when ChannelRepresentations in a IChatTrackingContext are updated.
     CTgstation.Server.Client.Components.IChatBotsClientFor managing the chat bots
     CTgstation.Server.Host.Components.Chat.IChatManagerFactoryFor creating IChatManagers
     CTgstation.Server.Host.Security.IClaimsInjectorFor injecting global::System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
     CTgstation.Server.Host.Components.Chat.Commands.ICommandRepresents a command that can be invoked by talking to chat bots
     CTgstation.Server.Host.Components.Chat.Commands.ICommandFactoryFactory for built in ICommands
     CTgstation.Server.Client.Components.IConfigurationClientFor managing ConfigurationFile files
     CTgstation.Server.Host.IO.IConsoleAbstraction for global::System.Console
     CTgstation.Server.Host.Components.Repository.ICredentialsProviderFor generating CredentialsHandlers
     CTgstation.Server.Host.Security.ICryptographySuiteContains various cryptographic functions
     CTgstation.Server.Host.Components.Chat.ICustomCommandHandlerHandles Commands.ICommands that map to those defined in a IChatTrackingContext
     CTgstation.Server.Host.Database.IDatabaseCollection< ChatBot >
     CTgstation.Server.Host.Database.IDatabaseCollection< ChatChannel >
     CTgstation.Server.Host.Database.IDatabaseCollection< CompileJob >
     CTgstation.Server.Host.Database.IDatabaseCollection< DreamDaemonSettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< DreamMakerSettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< DualReattachInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< Instance >
     CTgstation.Server.Host.Database.IDatabaseCollection< InstanceUser >
     CTgstation.Server.Host.Database.IDatabaseCollection< Job >
     CTgstation.Server.Host.Database.IDatabaseCollection< ReattachInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< RepositorySettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< RevisionInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< User >
     CTgstation.Server.Host.Database.IDatabaseConnectionFactoryFor creating raw DbConnections.
     CTgstation.Server.Host.Database.IDatabaseContextRepresents the database
     CTgstation.Server.Host.Database.IDatabaseContextFactoryFactory for scoping usage of IDatabaseContexts. Meant for use by Components
     CTgstation.Server.Host.Database.IDatabaseSeederFor initially seeding a database
     CIDesignTimeDbContextFactory
     CIDisposable
     CIDocumentFilter
     CTgstation.Server.Client.Components.IDreamDaemonClientFor managing DreamDaemon
     CTgstation.Server.Host.Components.Deployment.IDreamMakerFor managing the compiler
     CTgstation.Server.Client.Components.IDreamMakerClientFor managing the compiler
     CTgstation.Server.Host.Components.IEventConsumerConsumes EventTypes and takes the appropriate actions
     CTgstation.Server.Host.Core.IGitHubClientFactoryFor creating IGitHubClients
     CIHostApplicationLifetime
     CIHostedService
     CTgstation.Server.Host.Security.IIdentityCacheFor caching ISystemIdentitys
     CTgstation.Server.Client.Components.IInstanceClientFor managing a single Instance
     CTgstation.Server.Client.IInstanceManagerClientFor managing Instances
     CTgstation.Server.Client.Components.IInstanceUserClientFor managing InstanceUsers
     CTgstation.Server.Host.IO.IIOManagerInterface for using filesystems
     CTgstation.Server.Client.Components.IJobsClientAccess to running jobs
     CTgstation.Server.Host.Components.Deployment.ILatestCompileJobProviderProvides the most recently deployed CompileJob.
     CTgstation.Server.Host.Components.Repository.ILibGit2CommandsFor low level interactions with a LibGit2Sharp.IRepository.
     CTgstation.Server.Host.System.INetworkPromptReaperOn Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
     CTgstation.Server.Api.Models.InstanceMetadata about a server instance
     CTgstation.Server.Tests.InstanceManagerTest
     CTgstation.Server.Tests.Instance.InstanceTest
     CTgstation.Server.Api.Models.InstanceUserRepresents a Users permissions in an Instance
     CTgstation.Server.Tests.IntegrationTest
     CIOpenApiExtension
     CIOperationFilter
     CTgstation.Server.Api.ApiHeadersRepresents the header that must be present for every server request
     CTgstation.Server.Host.Extensions.ApplicationBuilderExtensionsExtensions for IApplicationBuilder
     CAuthorizeAttribute
     CTgstation.Server.Api.Models.ByondRepresents a BYOND installation
     CTgstation.Server.Host.Components.Chat.ChannelMappingRepresents a mapping of a ChannelRepresentation.RealId
     CTgstation.Server.Host.Components.Chat.ChannelRepresentationRepresents a Providers.IProvider channel.
     CTgstation.Server.Api.Models.Internal.ChatBotManage the server chat bots
     CTgstation.Server.Api.Models.ChatChannelIndicates a chat channel
     CTgstation.Server.Host.Extensions.ChatChannelExtensionsExtensions for the ChatChannel .
     CTgstation.Server.Host.Components.Interop.Topic.ChatCommandRepresents a chat command to be handled by DD
     CTgstation.Server.Api.Models.Internal.ChatConnectionStringBuilderHelper for building ChatBot.ConnectionStrings
     CTgstation.Server.Host.Components.Interop.ChatMessageRepresents a message to send to one or more Chat.ChannelRepresentations.
     CTgstation.Server.Host.Components.Interop.ChatUpdateRepresents an update of ChannelRepresentations.
     CTgstation.Server.Host.Components.Chat.ChatUserRepresents a tgs_chat_user datum
     CTgstation.Server.Host.Components.Session.CombinedTopicResponseCombines a global::Byond.TopicSender.TopicResponse with a TopicResponse.
     CTgstation.Server.Api.Models.ConfigurationFileRepresents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files
     CController
     CTgstation.Server.Host.Configuration.ControlPanelConfigurationConfiguration options for the web control panel
     CTgstation.Server.Host.Configuration.DatabaseConfigurationConfiguration options for the Database.DatabaseContext<TParentContext>
     CTgstation.Server.Host.Database.DatabaseContext< MySqlDatabaseContext >
     CTgstation.Server.Host.Database.DatabaseContext< SqliteDatabaseContext >
     CTgstation.Server.Host.Database.DatabaseContext< SqlServerDatabaseContext >
     CTgstation.Server.Host.Extensions.DatabaseContextExtensionsExtensions for the IDatabaseContext .
     CDbContext
     CTgstation.Server.Host.Database.Design.DesignTimeDbContextFactoryHelpersContains helpers for creating design time DatabaseContext<TParentContext>s
     CTgstation.Server.Host.Components.Interop.DMApiConstantsConstants used for communication with the DMAPI
     CTgstation.Server.Host.Components.Interop.DMApiParametersCommon base for interop parameters.
     CTgstation.Server.Host.Components.Interop.DMApiResponseCommon base for interop responses.
     CTgstation.Server.Api.Models.Internal.DreamDaemonLaunchParametersLaunch settings for DreamDaemon
     CTgstation.Server.Api.Models.DreamMakerRepresents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile
     CTgstation.Server.Host.Models.DualReattachInformationBaseBase class for DualReattachInformation
     CTgstation.Server.Api.Models.EntityIdCommon base of CompileJobs and Jobs.
     CTgstation.Server.Api.Models.ErrorCodeExtensionsExtension methods for the ErrorCode .
     CTgstation.Server.Api.Models.ErrorMessageRepresents an error message returned by the server
     CTgstation.Server.Host.Components.Interop.Topic.EventNotificationData structure for TopicCommandType.EventNotification requests.
     CTgstation.Server.Host.Configuration.FileLoggingConfigurationFile logging configuration options
     CTgstation.Server.Host.Extensions.HostBuilderExtensionsExtension methods for the IHostBuilder .
     CTgstation.Server.Client.IAdministrationClientFor managing server administration
     CTgstation.Server.Client.IApiClientFactoryFor creating IApiClients
     CTgstation.Server.Host.System.IAssemblyInformationProviderFor retrieving the Assembly's location.
     CTgstation.Server.Host.Core.IAsyncDelayerFor waiting asynchronously
     CTgstation.Server.Host.Security.IAuthenticationContextFactoryFor creating and accessing authentication contexts
     CTgstation.Server.Host.Components.Interop.Bridge.IBridgeDispatcherHandler for BridgeParameters.
     CTgstation.Server.Host.Components.Interop.Bridge.IBridgeRegistrarRegisters IBridgeHandlers.
     CTgstation.Server.Client.Components.IByondClientFor managing the Byond installation
     CTgstation.Server.Host.Components.Byond.IByondInstallerFor downloading and installing BYOND extractions for a given system
     CTgstation.Server.Host.Components.Chat.IChannelSinkNotifyee of when ChannelRepresentations in a IChatTrackingContext are updated.
     CTgstation.Server.Client.Components.IChatBotsClientFor managing the chat bots
     CTgstation.Server.Host.Components.Chat.IChatManagerFactoryFor creating IChatManagers
     CTgstation.Server.Host.Security.IClaimsInjectorFor injecting global::System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
     CTgstation.Server.Host.Components.Chat.Commands.ICommandRepresents a command that can be invoked by talking to chat bots
     CTgstation.Server.Host.Components.Chat.Commands.ICommandFactoryFactory for built in ICommands
     CTgstation.Server.Client.Components.IConfigurationClientFor managing ConfigurationFile files
     CTgstation.Server.Host.IO.IConsoleAbstraction for global::System.Console
     CTgstation.Server.Host.Components.Repository.ICredentialsProviderFor generating CredentialsHandlers
     CTgstation.Server.Host.Security.ICryptographySuiteContains various cryptographic functions
     CTgstation.Server.Host.Components.Chat.ICustomCommandHandlerHandles Commands.ICommands that map to those defined in a IChatTrackingContext
     CTgstation.Server.Host.Database.IDatabaseCollection< ChatBot >
     CTgstation.Server.Host.Database.IDatabaseCollection< ChatChannel >
     CTgstation.Server.Host.Database.IDatabaseCollection< CompileJob >
     CTgstation.Server.Host.Database.IDatabaseCollection< DreamDaemonSettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< DreamMakerSettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< DualReattachInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< Instance >
     CTgstation.Server.Host.Database.IDatabaseCollection< InstanceUser >
     CTgstation.Server.Host.Database.IDatabaseCollection< Job >
     CTgstation.Server.Host.Database.IDatabaseCollection< ReattachInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< RepositorySettings >
     CTgstation.Server.Host.Database.IDatabaseCollection< RevisionInformation >
     CTgstation.Server.Host.Database.IDatabaseCollection< User >
     CTgstation.Server.Host.Database.IDatabaseConnectionFactoryFor creating raw DbConnections.
     CTgstation.Server.Host.Database.IDatabaseContextRepresents the database.
     CTgstation.Server.Host.Database.IDatabaseContextFactoryFactory for scoping usage of IDatabaseContexts. Meant for use by Components
     CTgstation.Server.Host.Database.IDatabaseSeederFor initially seeding a database
     CIDesignTimeDbContextFactory
     CIDisposable
     CIDocumentFilter
     CTgstation.Server.Client.Components.IDreamDaemonClientFor managing DreamDaemon
     CTgstation.Server.Host.Components.Deployment.IDreamMakerFor managing the compiler
     CTgstation.Server.Client.Components.IDreamMakerClientFor managing the compiler
     CTgstation.Server.Host.Components.IEventConsumerConsumes EventTypes and takes the appropriate actions
     CTgstation.Server.Host.Core.IGitHubClientFactoryFor creating IGitHubClients
     CIHostedService
     CTgstation.Server.Host.Security.IIdentityCacheFor caching ISystemIdentitys
     CTgstation.Server.Client.Components.IInstanceClientFor managing a single Instance
     CTgstation.Server.Client.IInstanceManagerClientFor managing Instances
     CTgstation.Server.Client.Components.IInstanceUserClientFor managing InstanceUsers
     CTgstation.Server.Host.IO.IIOManagerInterface for using filesystems
     CTgstation.Server.Client.Components.IJobsClientAccess to running jobs
     CTgstation.Server.Host.Components.Deployment.ILatestCompileJobProviderProvides the most recently deployed CompileJob.
     CTgstation.Server.Host.Components.Repository.ILibGit2CommandsFor low level interactions with a LibGit2Sharp.IRepository.
     CTgstation.Server.Host.System.INetworkPromptReaperOn Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
     CTgstation.Server.Api.Models.InstanceMetadata about a server instance
     CTgstation.Server.Api.Models.InstanceUserRepresents a Users permissions in an Instance
     CIOpenApiExtension
     CIOperationFilter
     CTgstation.Server.Host.System.IPlatformIdentifierFor identifying the current platform
     CTgstation.Server.Host.Setup.IPostSetupServicesSet of objects needed to configure an Core.Application.
     CTgstation.Server.Host.IO.IPostWriteHandlerHandles changing file modes/permissions after writing
     CTgstation.Server.Host.System.IProcessExecutorFor launching IProcess'
     CTgstation.Server.Host.System.IProcessFeaturesAbstraction for suspending and resuming processes.
     CTgstation.Server.Host.Components.Chat.Providers.IProviderFactoryFactory for IProviders
     CIQueryable
     CTgstation.Server.Host.Components.Session.IReattachInfoHandlerHandles saving and loading DualReattachInformation
     CTgstation.Server.Client.Components.IRepositoryClientFor managing the Repository
     CTgstation.Server.Client.IRequestLoggerFor logging HTTP requests and responses
     CTgstation.Server.Host.Core.IRestartHandlerHandler for server restarts
     CISchemaFilter
     CTgstation.Server.Host.System.IPlatformIdentifierFor identifying the current platform
     CTgstation.Server.Host.Setup.IPostSetupServicesSet of objects needed to configure an Core.Application.
     CTgstation.Server.Host.IO.IPostWriteHandlerHandles changing file modes/permissions after writing
     CTgstation.Server.Host.System.IProcessExecutorFor launching IProcess'
     CTgstation.Server.Host.System.IProcessFeaturesAbstraction for suspending and resuming processes.
     CTgstation.Server.Host.Components.Chat.Providers.IProviderFactoryFactory for IProviders
     CIQueryable
     CTgstation.Server.Host.Components.Session.IReattachInfoHandlerHandles saving and loading DualReattachInformation
     CTgstation.Server.Client.Components.IRepositoryClientFor managing the Repository
     CTgstation.Server.Client.IRequestLoggerFor logging HTTP requests and responses
     CTgstation.Server.Host.Core.IRestartHandlerHandler for server restarts
     CISchemaFilter
     CTgstation.Server.Host.IServerRepresents the host
     CTgstation.Server.Client.IServerClientFactoryFactory for creating IServerClients
     CTgstation.Server.Host.Core.IServerControlRepresents a service that may take an updated Host assembly and run it, stopping the current assembly in the process
     CTgstation.Server.Host.IServerFactoryFor creating IServers
     CTgstation.Server.Host.Core.IServerPortProviderProvides access to the server's HttpApiPort.
     CTgstation.Server.Host.Components.Session.ISessionControllerFactoryFactory for ISessionControllers
     CTgstation.Server.Host.IO.ISymlinkFactoryFor creating filesystem symbolic links
     CTgstation.Server.Host.IO.ISynchronousIOManagerFor accessing the disk in a synchronous manner
     CTgstation.Server.Host.Security.ISystemIdentityFactoryFactory for ISystemIdentitys
     CTgstation.Server.Host.Security.ITokenFactoryFor creating Tokens
     CTgstation.Server.Client.IUsersClientFor managing Users
     CTgstation.Server.Host.Watchdog.IWatchdogThe watchdog for a Host
     CTgstation.Server.Host.Watchdog.IWatchdogFactoryFactory for creating IWatchdogs
     CTgstation.Server.Host.Components.Watchdog.IWatchdogFactoryFor creating IWatchdogs
     CTgstation.Server.Tests.Instance.JobsRequiredTest
     CJsonConverter
     CTgstation.Server.Host.Components.Session.LaunchResultRepresents the result of trying to start a DD process
     CTgstation.Server.Api.Models.LimitsSanity limits to prevent users from overloading
     CTgstation.Server.Host.Components.Chat.Providers.MessageRepresents a message recieved by a IProvider
     CMigration
     CModelSnapshot
     CTgstation.Server.Host.Components.Watchdog.MonitorStateThe (absolute) state of the ExperimentalWatchdog
     CTgstation.Server.Host.NativeMethodsNative Windows methods used by the code
     CTgstation.Server.Host.Service.ProgramContains the entrypoint for the application
     CTgstation.Server.Host.ProgramEntrypoint for the Process
     CTgstation.Server.Host.Console.ProgramContains the entrypoint for the application
     CReleaseNotes.ProgramContains the application entrypoint
     CTgstation.Server.Api.Models.Internal.RepositorySettingsRepresents configurable settings for a Repository
     CTgstation.Server.Host.Models.RevInfoTestMergeMany to many relationship for Models.RevisionInformation and Models.TestMerge
     CTgstation.Server.Api.Models.Internal.RevisionInformationRepresents information about a current git revison
     CTgstation.Server.Api.Rights.RightsHelperHelper for RightsTypes
     CTgstation.Server.Api.RoutesRoutes to a server actions
     CTgstation.Server.Api.Models.Internal.ServerInformationBase class for Models.ServerInformation.
     CTgstation.Server.Host.Components.StaticFiles.ServerSideModificationsRepresents code modifications via configuration
     CServiceBase
     CTgstation.Server.Host.Extensions.ServiceCollectionExtensionsExtensions for IServiceCollection
     CTgstation.Server.Host.Setup.SetupApplicationDI root for configuring a SetupWizard.
     CTgstation.Server.Host.Extensions.TaskExtensionsExtensions for the Task .
     CTgstation.Server.Client.Tests.TestApiClient
     CTgstation.Server.Api.Tests.TestApiHeadersTests for ApiHeaders
     CTgstation.Server.Host.Core.Tests.TestApplicationTests for Application
     CTgstation.Server.Host.Core.Tests.TestAsyncDelayer
     CTgstation.Server.Host.Security.Tests.TestAuthenticationContextTests for AuthenticationContext
     CTgstation.Server.Host.IO.Tests.TestConsole
     CTgstation.Server.Host.Database.Tests.TestDatabaseConnectionFactory
     CTgstation.Server.Host.Database.Tests.TestDatabaseContextFactory
     CTgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider
     CTgstation.Server.Client.Components.Tests.TestDreamDaemonClient
     CTgstation.Server.Api.Models.Tests.TestErrorCodeExtensionsTests for the ErrorMessage .
     CTgstation.Server.Host.Core.Tests.TestGitHubClientFactory
     CTgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder
     CTgstation.Server.Host.Jobs.Tests.TestJobException
     CTgstation.Server.Host.Jobs.Tests.TestJobHandler
     CTgstation.Server.Api.Models.TestMergeParametersParameters for creating a TestMerge
     CTgstation.Server.Host.System.Tests.TestPlatformIdentifier
     CTgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller
     CTgstation.Server.Host.IO.Tests.TestPostWriteHandler
     CTgstation.Server.Host.System.Tests.TestProcessFeaturesTests for IProcessFeatures.
     CTgstation.Server.Host.Tests.TestProgramTests for Program.
     CTgstation.Server.Host.Console.Tests.TestProgram
     CTgstation.Server.Host.Components.Repository.Tests.TestRepositoryFactoryTests for LibGit2RepositoryFactory.
     CTgstation.Server.Api.Rights.Tests.TestRightsTests for Rights
     CTgstation.Server.Client.Tests.TestServerClientFactory
     CTgstation.Server.Host.Tests.TestServerFactoryTests for ServerFactory
     CTgstation.Server.Host.Service.Tests.TestServerServiceTests for ServerService
     CTgstation.Server.Host.Extensions.Tests.TestServiceCollectionExtensions
     CTgstation.Server.Host.Setup.Tests.TestSetupWizard
     CTgstation.Server.Host.IO.Tests.TestSymlinkFactory
     CTgstation.Server.Host.Watchdog.Tests.TestWatchdog
     CTgstation.Server.Host.Watchdog.Tests.TestWatchdogFactoryTests for WatchdogFactory
     CTgstation.Server.Api.Models.TokenRepresents a JWT returned by the API
     CTgstation.Server.Host.Configuration.UpdatesConfigurationConfiguration for the automatic update system
     CTgstation.Server.Api.Models.Internal.UserRepresents a server User
     CTgstation.Server.Tests.UsersTest
     CTgstation.Server.Api.VersionExtensionsExtensions for the Version .
     CTgstation.Server.Tests.VersionsTest
     CTgstation.Server.Host.Extensions.WebHostBuilderExtensionsExtension methods for the IWebHostBuilder .
     CException
     CTgstation.Server.Host.IServerRepresents the host
     CTgstation.Server.Client.IServerClientFactoryFactory for creating IServerClients
     CTgstation.Server.Host.Core.IServerControlRepresents a service that may take an updated Host assembly and run it, stopping the current assembly in the process
     CTgstation.Server.Host.IServerFactoryFor creating IServers
     CTgstation.Server.Host.Core.IServerPortProviderProvides access to the server's HttpApiPort.
     CTgstation.Server.Host.Components.Session.ISessionControllerFactoryFactory for ISessionControllers
     CTgstation.Server.Host.IO.ISymlinkFactoryFor creating filesystem symbolic links
     CTgstation.Server.Host.IO.ISynchronousIOManagerFor accessing the disk in a synchronous manner
     CTgstation.Server.Host.Security.ISystemIdentityFactoryFactory for ISystemIdentitys
     CTgstation.Server.Host.Security.ITokenFactoryFor creating Tokens
     CTgstation.Server.Client.IUsersClientFor managing Users
     CTgstation.Server.Host.Watchdog.IWatchdogThe watchdog for a Host
     CTgstation.Server.Host.Watchdog.IWatchdogFactoryFactory for creating IWatchdogs
     CTgstation.Server.Host.Components.Watchdog.IWatchdogFactoryFor creating IWatchdogs
     CJsonConverter
     CTgstation.Server.Host.Components.Session.LaunchResultRepresents the result of trying to start a DD process
     CTgstation.Server.Api.Models.LimitsSanity limits to prevent users from overloading
     CTgstation.Server.Host.Components.Chat.Providers.MessageRepresents a message recieved by a IProvider
     CMigration
     CModelSnapshot
     CTgstation.Server.Host.Components.Watchdog.MonitorStateThe (absolute) state of the ExperimentalWatchdog
     CTgstation.Server.Host.NativeMethodsNative Windows methods used by the code
     CTgstation.Server.Host.Console.ProgramContains the entrypoint for the application
     CTgstation.Server.Host.Service.ProgramContains the entrypoint for the application
     CTgstation.Server.Host.ProgramEntrypoint for the Process
     CTgstation.Server.Api.Models.Internal.RepositorySettingsRepresents configurable settings for a Repository
     CTgstation.Server.Host.Models.RevInfoTestMergeMany to many relationship for Models.RevisionInformation and Models.TestMerge
     CTgstation.Server.Api.Models.Internal.RevisionInformationRepresents information about a current git revison
     CTgstation.Server.Api.Rights.RightsHelperHelper for RightsTypes
     CTgstation.Server.Api.RoutesRoutes to a server actions
     CTgstation.Server.Api.Models.Internal.ServerInformationBase class for Models.ServerInformation.
     CTgstation.Server.Host.Components.StaticFiles.ServerSideModificationsRepresents code modifications via configuration
     CServiceBase
     CTgstation.Server.Host.Extensions.ServiceCollectionExtensionsExtensions for IServiceCollection
     CTgstation.Server.Host.Setup.SetupApplicationDI root for configuring a SetupWizard.
     CTgstation.Server.Host.Extensions.TaskExtensionsExtensions for the Task .
     CTgstation.Server.Api.Models.TestMergeParametersParameters for creating a TestMerge
     CTgstation.Server.Api.Models.TokenRepresents a JWT returned by the API
     CTgstation.Server.Host.Configuration.UpdatesConfigurationConfiguration for the automatic update system
     CTgstation.Server.Api.Models.Internal.UserRepresents a server User
     CTgstation.Server.Api.VersionExtensionsExtensions for the Version .
     CTgstation.Server.Host.Extensions.WebHostBuilderExtensionsExtension methods for the IWebHostBuilder .
     CException
    diff --git a/index.html b/index.html index e779745cd7..0e041909ab 100644 --- a/index.html +++ b/index.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/inherit_graph_10.map b/inherit_graph_10.map index 1f258cce7f..351750534e 100644 --- a/inherit_graph_10.map +++ b/inherit_graph_10.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_10.md5 b/inherit_graph_10.md5 index 6ceeda052c..cb1228374f 100644 --- a/inherit_graph_10.md5 +++ b/inherit_graph_10.md5 @@ -1 +1 @@ -1a132e68526d97f993b7854c55468616 \ No newline at end of file +5be46402fce84065bbd10e5bdc960b4d \ No newline at end of file diff --git a/inherit_graph_10.png b/inherit_graph_10.png index aea195e1f4..3079187009 100644 Binary files a/inherit_graph_10.png and b/inherit_graph_10.png differ diff --git a/inherit_graph_100.map b/inherit_graph_100.map index 81b9a7494c..d1907a7018 100644 --- a/inherit_graph_100.map +++ b/inherit_graph_100.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_100.md5 b/inherit_graph_100.md5 index 1ccb331fa3..0e043be39d 100644 --- a/inherit_graph_100.md5 +++ b/inherit_graph_100.md5 @@ -1 +1 @@ -a03d3790a20973aac9460646af05026f \ No newline at end of file +979776af19b3e059931577165fd552b1 \ No newline at end of file diff --git a/inherit_graph_100.png b/inherit_graph_100.png index 88aa814645..5b6f9ba339 100644 Binary files a/inherit_graph_100.png and b/inherit_graph_100.png differ diff --git a/inherit_graph_101.map b/inherit_graph_101.map index c05d9a8a5f..ebb82d0ff8 100644 --- a/inherit_graph_101.map +++ b/inherit_graph_101.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_101.md5 b/inherit_graph_101.md5 index b9e0ea0baf..59d8668a23 100644 --- a/inherit_graph_101.md5 +++ b/inherit_graph_101.md5 @@ -1 +1 @@ -e5ad2b4101b0145d747442edc5bbee3e \ No newline at end of file +1f8323ae1ee240c03583af72610e4afb \ No newline at end of file diff --git a/inherit_graph_101.png b/inherit_graph_101.png index b16d484f53..a3c1eb1901 100644 Binary files a/inherit_graph_101.png and b/inherit_graph_101.png differ diff --git a/inherit_graph_102.map b/inherit_graph_102.map index f6a020485d..9e0385850b 100644 --- a/inherit_graph_102.map +++ b/inherit_graph_102.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_102.md5 b/inherit_graph_102.md5 index 53dd8ed810..ebd1496f74 100644 --- a/inherit_graph_102.md5 +++ b/inherit_graph_102.md5 @@ -1 +1 @@ -d499dc833a5b396414675c7410d45377 \ No newline at end of file +d2646c5eb750ae2f07ee30dc21f07117 \ No newline at end of file diff --git a/inherit_graph_102.png b/inherit_graph_102.png index 34f1cf082f..f9fc5327be 100644 Binary files a/inherit_graph_102.png and b/inherit_graph_102.png differ diff --git a/inherit_graph_103.map b/inherit_graph_103.map index 7234fe3c65..ae4538f6ef 100644 --- a/inherit_graph_103.map +++ b/inherit_graph_103.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_103.md5 b/inherit_graph_103.md5 index 38a9539476..1328c87ec0 100644 --- a/inherit_graph_103.md5 +++ b/inherit_graph_103.md5 @@ -1 +1 @@ -38ee920d6456a34d6bc7b5b0cfe3ab9e \ No newline at end of file +fddb972982ff27c7d0891e1f60bca4ca \ No newline at end of file diff --git a/inherit_graph_103.png b/inherit_graph_103.png index 60e9acf810..df61233311 100644 Binary files a/inherit_graph_103.png and b/inherit_graph_103.png differ diff --git a/inherit_graph_104.map b/inherit_graph_104.map index 5e560008e1..3bbdb03bd7 100644 --- a/inherit_graph_104.map +++ b/inherit_graph_104.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_104.md5 b/inherit_graph_104.md5 index ca91149eed..3b78dd7968 100644 --- a/inherit_graph_104.md5 +++ b/inherit_graph_104.md5 @@ -1 +1 @@ -cabfe90dd0c7d6dd0ee4a76df2ed0c38 \ No newline at end of file +b8815328e5b63ea0be9b66807d75109c \ No newline at end of file diff --git a/inherit_graph_104.png b/inherit_graph_104.png index ff94cbb17e..92ae81274b 100644 Binary files a/inherit_graph_104.png and b/inherit_graph_104.png differ diff --git a/inherit_graph_105.map b/inherit_graph_105.map index 128686ad13..0f6946aa33 100644 --- a/inherit_graph_105.map +++ b/inherit_graph_105.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_105.md5 b/inherit_graph_105.md5 index cd3d617d29..15aea6a9c0 100644 --- a/inherit_graph_105.md5 +++ b/inherit_graph_105.md5 @@ -1 +1 @@ -5c866b42544fea6737963062c694e45c \ No newline at end of file +a094992ea46d173f63c0b1c4514eaa6d \ No newline at end of file diff --git a/inherit_graph_105.png b/inherit_graph_105.png index 09ae496298..fbf3edbfcd 100644 Binary files a/inherit_graph_105.png and b/inherit_graph_105.png differ diff --git a/inherit_graph_106.map b/inherit_graph_106.map index 02a25f9e85..c3be283b4e 100644 --- a/inherit_graph_106.map +++ b/inherit_graph_106.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_106.md5 b/inherit_graph_106.md5 index 50ca718a3f..976e111741 100644 --- a/inherit_graph_106.md5 +++ b/inherit_graph_106.md5 @@ -1 +1 @@ -356e26eadd4741bc864d622f3bc0ba71 \ No newline at end of file +50b18ab1f0a3caa361c62c79a552484a \ No newline at end of file diff --git a/inherit_graph_106.png b/inherit_graph_106.png index f05cf2b47d..408d164b0d 100644 Binary files a/inherit_graph_106.png and b/inherit_graph_106.png differ diff --git a/inherit_graph_107.map b/inherit_graph_107.map index 0254131034..b6308ef7c7 100644 --- a/inherit_graph_107.map +++ b/inherit_graph_107.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_107.md5 b/inherit_graph_107.md5 index 24225e300a..e99d0cb6e4 100644 --- a/inherit_graph_107.md5 +++ b/inherit_graph_107.md5 @@ -1 +1 @@ -97464b8073ac882c2c06be74419632af \ No newline at end of file +3b7284f92a6ef367c557db417d2b51e0 \ No newline at end of file diff --git a/inherit_graph_107.png b/inherit_graph_107.png index 8cc8d1ea44..b1833b9694 100644 Binary files a/inherit_graph_107.png and b/inherit_graph_107.png differ diff --git a/inherit_graph_108.map b/inherit_graph_108.map index 31bd66a846..3cf94e2d5a 100644 --- a/inherit_graph_108.map +++ b/inherit_graph_108.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_108.md5 b/inherit_graph_108.md5 index 0e81c6d3a5..628307802f 100644 --- a/inherit_graph_108.md5 +++ b/inherit_graph_108.md5 @@ -1 +1 @@ -fb11efde3071f90974ffc0bc1154eb46 \ No newline at end of file +8a02dd539d4fb52219ab62be1fe5e545 \ No newline at end of file diff --git a/inherit_graph_108.png b/inherit_graph_108.png index 5b790753b9..d222708bc7 100644 Binary files a/inherit_graph_108.png and b/inherit_graph_108.png differ diff --git a/inherit_graph_109.map b/inherit_graph_109.map index 3a94b424bf..5f74d8dd7a 100644 --- a/inherit_graph_109.map +++ b/inherit_graph_109.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_109.md5 b/inherit_graph_109.md5 index a87cc9b215..d1c800d989 100644 --- a/inherit_graph_109.md5 +++ b/inherit_graph_109.md5 @@ -1 +1 @@ -32b7e90f34248a08cf331aaec6f0931a \ No newline at end of file +61d091487dabc5b59a38fd131b484cb1 \ No newline at end of file diff --git a/inherit_graph_109.png b/inherit_graph_109.png index 1a3c14cf72..e46a1f3d96 100644 Binary files a/inherit_graph_109.png and b/inherit_graph_109.png differ diff --git a/inherit_graph_11.map b/inherit_graph_11.map index f6a74398c7..1e0de7bef2 100644 --- a/inherit_graph_11.map +++ b/inherit_graph_11.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_11.md5 b/inherit_graph_11.md5 index 17b25630e5..7bd5a28849 100644 --- a/inherit_graph_11.md5 +++ b/inherit_graph_11.md5 @@ -1 +1 @@ -ba64924fb6b41d9694c65dbcdecf6361 \ No newline at end of file +f148ca661db956269aa0bb75716231eb \ No newline at end of file diff --git a/inherit_graph_11.png b/inherit_graph_11.png index d61bcd1aaa..dd9986dce8 100644 Binary files a/inherit_graph_11.png and b/inherit_graph_11.png differ diff --git a/inherit_graph_110.map b/inherit_graph_110.map index 135592c852..6015ecc6bc 100644 --- a/inherit_graph_110.map +++ b/inherit_graph_110.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_110.md5 b/inherit_graph_110.md5 index 5d847ef074..44727af27a 100644 --- a/inherit_graph_110.md5 +++ b/inherit_graph_110.md5 @@ -1 +1 @@ -855b48930a96a02088d3630ce2c08980 \ No newline at end of file +12da20b6806d515fcd2714cb8a8a0ab4 \ No newline at end of file diff --git a/inherit_graph_110.png b/inherit_graph_110.png index c169b3c5a5..96c671bbf7 100644 Binary files a/inherit_graph_110.png and b/inherit_graph_110.png differ diff --git a/inherit_graph_111.map b/inherit_graph_111.map index dc1ab3d140..28a6157521 100644 --- a/inherit_graph_111.map +++ b/inherit_graph_111.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_111.md5 b/inherit_graph_111.md5 index e4fc90e47c..f5a0dca2d5 100644 --- a/inherit_graph_111.md5 +++ b/inherit_graph_111.md5 @@ -1 +1 @@ -12c61d7d05f6b06671f58ffe91c3cb2e \ No newline at end of file +d59238d386a6ead622dbc3f2cc94fa5e \ No newline at end of file diff --git a/inherit_graph_111.png b/inherit_graph_111.png index 424492e34a..a4fb9b33c1 100644 Binary files a/inherit_graph_111.png and b/inherit_graph_111.png differ diff --git a/inherit_graph_112.map b/inherit_graph_112.map index 43d4244ca6..a30ca076c1 100644 --- a/inherit_graph_112.map +++ b/inherit_graph_112.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_112.md5 b/inherit_graph_112.md5 index 983bcd0a1f..0fad345906 100644 --- a/inherit_graph_112.md5 +++ b/inherit_graph_112.md5 @@ -1 +1 @@ -b0db055b29cab9497f12839e79b19364 \ No newline at end of file +7024895eb47f8ec25fc9e44e9a814bb4 \ No newline at end of file diff --git a/inherit_graph_112.png b/inherit_graph_112.png index 01c9d3edeb..2a9167fdc6 100644 Binary files a/inherit_graph_112.png and b/inherit_graph_112.png differ diff --git a/inherit_graph_113.map b/inherit_graph_113.map index 5dc2f1a3e1..ba5507d1c1 100644 --- a/inherit_graph_113.map +++ b/inherit_graph_113.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_113.md5 b/inherit_graph_113.md5 index 71a9ab573f..4356ef2532 100644 --- a/inherit_graph_113.md5 +++ b/inherit_graph_113.md5 @@ -1 +1 @@ -00dd9285f22e84faa176aa154852ccf8 \ No newline at end of file +adf9e3a60c5dd474ddc8b8e775fdbccc \ No newline at end of file diff --git a/inherit_graph_113.png b/inherit_graph_113.png index 1338a63a98..1bfb9e7ad6 100644 Binary files a/inherit_graph_113.png and b/inherit_graph_113.png differ diff --git a/inherit_graph_114.map b/inherit_graph_114.map index cdc763c05f..4cfcb5bd82 100644 --- a/inherit_graph_114.map +++ b/inherit_graph_114.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_114.md5 b/inherit_graph_114.md5 index ba6bb45120..666d2c8c68 100644 --- a/inherit_graph_114.md5 +++ b/inherit_graph_114.md5 @@ -1 +1 @@ -7405905bb95d87065a7679d129468c67 \ No newline at end of file +703f1e45f52519c85229bebdaa927492 \ No newline at end of file diff --git a/inherit_graph_114.png b/inherit_graph_114.png index 2f4a512add..224697efc8 100644 Binary files a/inherit_graph_114.png and b/inherit_graph_114.png differ diff --git a/inherit_graph_115.map b/inherit_graph_115.map index d1907a7018..5c2f2d44e0 100644 --- a/inherit_graph_115.map +++ b/inherit_graph_115.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_115.md5 b/inherit_graph_115.md5 index 0e043be39d..75471a10af 100644 --- a/inherit_graph_115.md5 +++ b/inherit_graph_115.md5 @@ -1 +1 @@ -979776af19b3e059931577165fd552b1 \ No newline at end of file +9c7fc4de2c35d664eca77ec1a9366336 \ No newline at end of file diff --git a/inherit_graph_115.png b/inherit_graph_115.png index 5b6f9ba339..f803b6dc78 100644 Binary files a/inherit_graph_115.png and b/inherit_graph_115.png differ diff --git a/inherit_graph_116.map b/inherit_graph_116.map index ebb82d0ff8..6a8c185280 100644 --- a/inherit_graph_116.map +++ b/inherit_graph_116.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_116.md5 b/inherit_graph_116.md5 index 59d8668a23..729ee134ef 100644 --- a/inherit_graph_116.md5 +++ b/inherit_graph_116.md5 @@ -1 +1 @@ -1f8323ae1ee240c03583af72610e4afb \ No newline at end of file +aefe74f0b10b6aa616a65ef0a011a82a \ No newline at end of file diff --git a/inherit_graph_116.png b/inherit_graph_116.png index a3c1eb1901..112cf1c795 100644 Binary files a/inherit_graph_116.png and b/inherit_graph_116.png differ diff --git a/inherit_graph_117.map b/inherit_graph_117.map index 9e0385850b..1dbb87d962 100644 --- a/inherit_graph_117.map +++ b/inherit_graph_117.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_117.md5 b/inherit_graph_117.md5 index ebd1496f74..ee2e53282d 100644 --- a/inherit_graph_117.md5 +++ b/inherit_graph_117.md5 @@ -1 +1 @@ -d2646c5eb750ae2f07ee30dc21f07117 \ No newline at end of file +0f77f11719e11d4568fdf2dad5265da9 \ No newline at end of file diff --git a/inherit_graph_117.png b/inherit_graph_117.png index f9fc5327be..7440f45a17 100644 Binary files a/inherit_graph_117.png and b/inherit_graph_117.png differ diff --git a/inherit_graph_118.map b/inherit_graph_118.map index 4bafebc0e5..d86bb849ba 100644 --- a/inherit_graph_118.map +++ b/inherit_graph_118.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/inherit_graph_118.md5 b/inherit_graph_118.md5 index c22bf3a6ff..0e642b6cc6 100644 --- a/inherit_graph_118.md5 +++ b/inherit_graph_118.md5 @@ -1 +1 @@ -39fb02d3621d95923bab87d50623eb94 \ No newline at end of file +df08ec845b59a263a76b179ce9fae73c \ No newline at end of file diff --git a/inherit_graph_118.png b/inherit_graph_118.png index df61233311..b83bfc5650 100644 Binary files a/inherit_graph_118.png and b/inherit_graph_118.png differ diff --git a/inherit_graph_119.map b/inherit_graph_119.map index 3bbdb03bd7..8ffdb9c46b 100644 --- a/inherit_graph_119.map +++ b/inherit_graph_119.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_119.md5 b/inherit_graph_119.md5 index 3b78dd7968..5338a750ef 100644 --- a/inherit_graph_119.md5 +++ b/inherit_graph_119.md5 @@ -1 +1 @@ -b8815328e5b63ea0be9b66807d75109c \ No newline at end of file +9fd5bccfc542b80f2f7c21a76e3bca7c \ No newline at end of file diff --git a/inherit_graph_119.png b/inherit_graph_119.png index 92ae81274b..e2f15b9686 100644 Binary files a/inherit_graph_119.png and b/inherit_graph_119.png differ diff --git a/inherit_graph_12.map b/inherit_graph_12.map index 351750534e..58ca28f088 100644 --- a/inherit_graph_12.map +++ b/inherit_graph_12.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_12.md5 b/inherit_graph_12.md5 index cb1228374f..656ebf19fd 100644 --- a/inherit_graph_12.md5 +++ b/inherit_graph_12.md5 @@ -1 +1 @@ -5be46402fce84065bbd10e5bdc960b4d \ No newline at end of file +3cdb4038223b0c0fb34168f0eb7bd515 \ No newline at end of file diff --git a/inherit_graph_12.png b/inherit_graph_12.png index 3079187009..066d346d3c 100644 Binary files a/inherit_graph_12.png and b/inherit_graph_12.png differ diff --git a/inherit_graph_120.map b/inherit_graph_120.map index 0f6946aa33..78474ab899 100644 --- a/inherit_graph_120.map +++ b/inherit_graph_120.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_120.md5 b/inherit_graph_120.md5 index 15aea6a9c0..8db5ad97c5 100644 --- a/inherit_graph_120.md5 +++ b/inherit_graph_120.md5 @@ -1 +1 @@ -a094992ea46d173f63c0b1c4514eaa6d \ No newline at end of file +04dfc13712aea15b301e28b076a7f4d3 \ No newline at end of file diff --git a/inherit_graph_120.png b/inherit_graph_120.png index fbf3edbfcd..d9c77b1a93 100644 Binary files a/inherit_graph_120.png and b/inherit_graph_120.png differ diff --git a/inherit_graph_121.map b/inherit_graph_121.map index 556aac6429..ef72f10332 100644 --- a/inherit_graph_121.map +++ b/inherit_graph_121.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_121.md5 b/inherit_graph_121.md5 index 9553f0d6e3..349fa9856f 100644 --- a/inherit_graph_121.md5 +++ b/inherit_graph_121.md5 @@ -1 +1 @@ -345b17ebd5510cda6063b9d060855254 \ No newline at end of file +c8e3ebf874d343bcfe48b56d033b91c1 \ No newline at end of file diff --git a/inherit_graph_121.png b/inherit_graph_121.png index 6b00edd8fc..ae4fe7aabc 100644 Binary files a/inherit_graph_121.png and b/inherit_graph_121.png differ diff --git a/inherit_graph_122.map b/inherit_graph_122.map index 2606a8d0c7..48e868f116 100644 --- a/inherit_graph_122.map +++ b/inherit_graph_122.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_122.md5 b/inherit_graph_122.md5 index 168e79aec6..386af0d840 100644 --- a/inherit_graph_122.md5 +++ b/inherit_graph_122.md5 @@ -1 +1 @@ -d553140ddbb4e05355294ad6b83926f1 \ No newline at end of file +6d6c288fe30a87f092f32e7c13527039 \ No newline at end of file diff --git a/inherit_graph_122.png b/inherit_graph_122.png index 5899020d73..a371be568f 100644 Binary files a/inherit_graph_122.png and b/inherit_graph_122.png differ diff --git a/inherit_graph_123.map b/inherit_graph_123.map index c3be283b4e..88a2d02846 100644 --- a/inherit_graph_123.map +++ b/inherit_graph_123.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_123.md5 b/inherit_graph_123.md5 index 976e111741..14353dd225 100644 --- a/inherit_graph_123.md5 +++ b/inherit_graph_123.md5 @@ -1 +1 @@ -50b18ab1f0a3caa361c62c79a552484a \ No newline at end of file +65144b396f79c0909f2ff1e9aca0a948 \ No newline at end of file diff --git a/inherit_graph_123.png b/inherit_graph_123.png index 408d164b0d..ec92554f91 100644 Binary files a/inherit_graph_123.png and b/inherit_graph_123.png differ diff --git a/inherit_graph_124.map b/inherit_graph_124.map index b6308ef7c7..75f787f54d 100644 --- a/inherit_graph_124.map +++ b/inherit_graph_124.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_124.md5 b/inherit_graph_124.md5 index e99d0cb6e4..09de2a3267 100644 --- a/inherit_graph_124.md5 +++ b/inherit_graph_124.md5 @@ -1 +1 @@ -3b7284f92a6ef367c557db417d2b51e0 \ No newline at end of file +c0a2e752222e6986eddf7d6b0de81c9d \ No newline at end of file diff --git a/inherit_graph_124.png b/inherit_graph_124.png index b1833b9694..50cda99920 100644 Binary files a/inherit_graph_124.png and b/inherit_graph_124.png differ diff --git a/inherit_graph_125.map b/inherit_graph_125.map index 3cf94e2d5a..c43c8b7e07 100644 --- a/inherit_graph_125.map +++ b/inherit_graph_125.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_125.md5 b/inherit_graph_125.md5 index 628307802f..bdada08155 100644 --- a/inherit_graph_125.md5 +++ b/inherit_graph_125.md5 @@ -1 +1 @@ -8a02dd539d4fb52219ab62be1fe5e545 \ No newline at end of file +a906d26602bc9f33b69639f65001e3ca \ No newline at end of file diff --git a/inherit_graph_125.png b/inherit_graph_125.png index d222708bc7..aedb2c89e9 100644 Binary files a/inherit_graph_125.png and b/inherit_graph_125.png differ diff --git a/inherit_graph_126.map b/inherit_graph_126.map index 5f74d8dd7a..2ca87be266 100644 --- a/inherit_graph_126.map +++ b/inherit_graph_126.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_126.md5 b/inherit_graph_126.md5 index d1c800d989..d903f421d0 100644 --- a/inherit_graph_126.md5 +++ b/inherit_graph_126.md5 @@ -1 +1 @@ -61d091487dabc5b59a38fd131b484cb1 \ No newline at end of file +df955dbc66523bfdf8d8db593d8d3058 \ No newline at end of file diff --git a/inherit_graph_126.png b/inherit_graph_126.png index e46a1f3d96..1320eea34c 100644 Binary files a/inherit_graph_126.png and b/inherit_graph_126.png differ diff --git a/inherit_graph_127.map b/inherit_graph_127.map index 6015ecc6bc..5cfc49282c 100644 --- a/inherit_graph_127.map +++ b/inherit_graph_127.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_127.md5 b/inherit_graph_127.md5 index 44727af27a..429c5f963c 100644 --- a/inherit_graph_127.md5 +++ b/inherit_graph_127.md5 @@ -1 +1 @@ -12da20b6806d515fcd2714cb8a8a0ab4 \ No newline at end of file +6eb8e41036b77a53c06a3273dc835dfb \ No newline at end of file diff --git a/inherit_graph_127.png b/inherit_graph_127.png index 96c671bbf7..d82c5b198d 100644 Binary files a/inherit_graph_127.png and b/inherit_graph_127.png differ diff --git a/inherit_graph_128.map b/inherit_graph_128.map index 28a6157521..362508c231 100644 --- a/inherit_graph_128.map +++ b/inherit_graph_128.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_128.md5 b/inherit_graph_128.md5 index f5a0dca2d5..13e57f461e 100644 --- a/inherit_graph_128.md5 +++ b/inherit_graph_128.md5 @@ -1 +1 @@ -d59238d386a6ead622dbc3f2cc94fa5e \ No newline at end of file +f5d5aae1a13d856ba75f19d12f39335d \ No newline at end of file diff --git a/inherit_graph_128.png b/inherit_graph_128.png index a4fb9b33c1..4171626f6f 100644 Binary files a/inherit_graph_128.png and b/inherit_graph_128.png differ diff --git a/inherit_graph_129.map b/inherit_graph_129.map index 17ad4428d3..75a89d80e2 100644 --- a/inherit_graph_129.map +++ b/inherit_graph_129.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_129.md5 b/inherit_graph_129.md5 index 6ec4bc9855..eb8f849363 100644 --- a/inherit_graph_129.md5 +++ b/inherit_graph_129.md5 @@ -1 +1 @@ -602719c64909bf46e3a1da5dbca1be93 \ No newline at end of file +6ac71f48bcd1187c2c9878b87b48b3ef \ No newline at end of file diff --git a/inherit_graph_129.png b/inherit_graph_129.png index edaa9dbdd2..3ffbac9f3f 100644 Binary files a/inherit_graph_129.png and b/inherit_graph_129.png differ diff --git a/inherit_graph_13.map b/inherit_graph_13.map index 1e0de7bef2..22059b37b9 100644 --- a/inherit_graph_13.map +++ b/inherit_graph_13.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_13.md5 b/inherit_graph_13.md5 index 7bd5a28849..4a61e1d82d 100644 --- a/inherit_graph_13.md5 +++ b/inherit_graph_13.md5 @@ -1 +1 @@ -f148ca661db956269aa0bb75716231eb \ No newline at end of file +4e05ae1968718f58381cfddb1806b0c5 \ No newline at end of file diff --git a/inherit_graph_13.png b/inherit_graph_13.png index dd9986dce8..7370b71ab5 100644 Binary files a/inherit_graph_13.png and b/inherit_graph_13.png differ diff --git a/inherit_graph_130.map b/inherit_graph_130.map index 51cdd25813..6f59032992 100644 --- a/inherit_graph_130.map +++ b/inherit_graph_130.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_130.md5 b/inherit_graph_130.md5 index 21dee44b20..1be317e432 100644 --- a/inherit_graph_130.md5 +++ b/inherit_graph_130.md5 @@ -1 +1 @@ -d2554b673be4ad5cc32b1e4b63f3e399 \ No newline at end of file +8c17a61f752958c10ba513d56562c93c \ No newline at end of file diff --git a/inherit_graph_130.png b/inherit_graph_130.png index b17e1a4e48..2e9f48f7aa 100644 Binary files a/inherit_graph_130.png and b/inherit_graph_130.png differ diff --git a/inherit_graph_131.map b/inherit_graph_131.map index 0082a649e4..56da3c03b5 100644 --- a/inherit_graph_131.map +++ b/inherit_graph_131.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_131.md5 b/inherit_graph_131.md5 index de8244d6b9..4a3a9ae1cb 100644 --- a/inherit_graph_131.md5 +++ b/inherit_graph_131.md5 @@ -1 +1 @@ -1c256f2b3d6acc4f10616f69c18a022c \ No newline at end of file +e12cbfdd53162803d87aea47ac930d56 \ No newline at end of file diff --git a/inherit_graph_131.png b/inherit_graph_131.png index 3d4b5e462c..05ba37c5e9 100644 Binary files a/inherit_graph_131.png and b/inherit_graph_131.png differ diff --git a/inherit_graph_132.map b/inherit_graph_132.map index 99303cc4c8..0c23c292b0 100644 --- a/inherit_graph_132.map +++ b/inherit_graph_132.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_132.md5 b/inherit_graph_132.md5 index dde4ffe3d2..8c016b09de 100644 --- a/inherit_graph_132.md5 +++ b/inherit_graph_132.md5 @@ -1 +1 @@ -d82f9818a968929454cc57165620b1bc \ No newline at end of file +ebf2dd0f08b6fdc3ebd09c6ef74bcccb \ No newline at end of file diff --git a/inherit_graph_132.png b/inherit_graph_132.png index 68fc5e817b..8b1f459168 100644 Binary files a/inherit_graph_132.png and b/inherit_graph_132.png differ diff --git a/inherit_graph_133.map b/inherit_graph_133.map index 9fc6e59e44..5291a8eaab 100644 --- a/inherit_graph_133.map +++ b/inherit_graph_133.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_133.md5 b/inherit_graph_133.md5 index cf378efa75..a4ce8e6dc9 100644 --- a/inherit_graph_133.md5 +++ b/inherit_graph_133.md5 @@ -1 +1 @@ -225c6bc746969b36cbbaf52362de867d \ No newline at end of file +f3fb07accc30dceeb578f2283126f5c9 \ No newline at end of file diff --git a/inherit_graph_133.png b/inherit_graph_133.png index f6f03bde8f..a92ab07a58 100644 Binary files a/inherit_graph_133.png and b/inherit_graph_133.png differ diff --git a/inherit_graph_134.map b/inherit_graph_134.map index a30ca076c1..9b67f77a42 100644 --- a/inherit_graph_134.map +++ b/inherit_graph_134.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_134.md5 b/inherit_graph_134.md5 index 0fad345906..7b19b80822 100644 --- a/inherit_graph_134.md5 +++ b/inherit_graph_134.md5 @@ -1 +1 @@ -7024895eb47f8ec25fc9e44e9a814bb4 \ No newline at end of file +318adbdad58c696ed75e5509737a80b2 \ No newline at end of file diff --git a/inherit_graph_134.png b/inherit_graph_134.png index 2a9167fdc6..608c403957 100644 Binary files a/inherit_graph_134.png and b/inherit_graph_134.png differ diff --git a/inherit_graph_14.map b/inherit_graph_14.map index 58ca28f088..480c248b87 100644 --- a/inherit_graph_14.map +++ b/inherit_graph_14.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_14.md5 b/inherit_graph_14.md5 index 656ebf19fd..d9cdfb146b 100644 --- a/inherit_graph_14.md5 +++ b/inherit_graph_14.md5 @@ -1 +1 @@ -3cdb4038223b0c0fb34168f0eb7bd515 \ No newline at end of file +79341322b25618806a012ab4c8385158 \ No newline at end of file diff --git a/inherit_graph_14.png b/inherit_graph_14.png index 066d346d3c..eef2844029 100644 Binary files a/inherit_graph_14.png and b/inherit_graph_14.png differ diff --git a/inherit_graph_15.map b/inherit_graph_15.map index 22059b37b9..2bf066151a 100644 --- a/inherit_graph_15.map +++ b/inherit_graph_15.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_15.md5 b/inherit_graph_15.md5 index 4a61e1d82d..887b6f4ce5 100644 --- a/inherit_graph_15.md5 +++ b/inherit_graph_15.md5 @@ -1 +1 @@ -4e05ae1968718f58381cfddb1806b0c5 \ No newline at end of file +c1e50adf8bcd29ae6d2f73cfe8e58d6c \ No newline at end of file diff --git a/inherit_graph_15.png b/inherit_graph_15.png index 7370b71ab5..beb57747fe 100644 Binary files a/inherit_graph_15.png and b/inherit_graph_15.png differ diff --git a/inherit_graph_16.map b/inherit_graph_16.map index 480c248b87..d5aea2fe1a 100644 --- a/inherit_graph_16.map +++ b/inherit_graph_16.map @@ -1,3 +1,9 @@ - + + + + + + + diff --git a/inherit_graph_16.md5 b/inherit_graph_16.md5 index d9cdfb146b..2e2d7dc6c3 100644 --- a/inherit_graph_16.md5 +++ b/inherit_graph_16.md5 @@ -1 +1 @@ -79341322b25618806a012ab4c8385158 \ No newline at end of file +aa37fd60f32eaf3f8e336799f71759b2 \ No newline at end of file diff --git a/inherit_graph_16.png b/inherit_graph_16.png index eef2844029..5672e364b1 100644 Binary files a/inherit_graph_16.png and b/inherit_graph_16.png differ diff --git a/inherit_graph_17.map b/inherit_graph_17.map index 2bf066151a..79f97e58ca 100644 --- a/inherit_graph_17.map +++ b/inherit_graph_17.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_17.md5 b/inherit_graph_17.md5 index 887b6f4ce5..34408c6d8a 100644 --- a/inherit_graph_17.md5 +++ b/inherit_graph_17.md5 @@ -1 +1 @@ -c1e50adf8bcd29ae6d2f73cfe8e58d6c \ No newline at end of file +5b8c454c971811eaee55a296d5dc5c5c \ No newline at end of file diff --git a/inherit_graph_17.png b/inherit_graph_17.png index beb57747fe..00f5aebc5d 100644 Binary files a/inherit_graph_17.png and b/inherit_graph_17.png differ diff --git a/inherit_graph_18.map b/inherit_graph_18.map index d5aea2fe1a..7be69daa83 100644 --- a/inherit_graph_18.map +++ b/inherit_graph_18.map @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/inherit_graph_18.md5 b/inherit_graph_18.md5 index 2e2d7dc6c3..7d6695f89b 100644 --- a/inherit_graph_18.md5 +++ b/inherit_graph_18.md5 @@ -1 +1 @@ -aa37fd60f32eaf3f8e336799f71759b2 \ No newline at end of file +077af19d79f085da5395728ebc5dc6e9 \ No newline at end of file diff --git a/inherit_graph_18.png b/inherit_graph_18.png index 5672e364b1..3e6682603f 100644 Binary files a/inherit_graph_18.png and b/inherit_graph_18.png differ diff --git a/inherit_graph_19.map b/inherit_graph_19.map index 79f97e58ca..a2f1fa0627 100644 --- a/inherit_graph_19.map +++ b/inherit_graph_19.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_19.md5 b/inherit_graph_19.md5 index 34408c6d8a..de38b527f5 100644 --- a/inherit_graph_19.md5 +++ b/inherit_graph_19.md5 @@ -1 +1 @@ -5b8c454c971811eaee55a296d5dc5c5c \ No newline at end of file +b5073534fee503e67602e4a7b905679a \ No newline at end of file diff --git a/inherit_graph_19.png b/inherit_graph_19.png index 00f5aebc5d..32b388a946 100644 Binary files a/inherit_graph_19.png and b/inherit_graph_19.png differ diff --git a/inherit_graph_2.map b/inherit_graph_2.map index 132bb202a3..6a5daa19c2 100644 --- a/inherit_graph_2.map +++ b/inherit_graph_2.map @@ -1,6 +1,6 @@ - - - + + + diff --git a/inherit_graph_2.md5 b/inherit_graph_2.md5 index ebe1c47aae..97355a6b2d 100644 --- a/inherit_graph_2.md5 +++ b/inherit_graph_2.md5 @@ -1 +1 @@ -8b846694f4536212ac470975f7542275 \ No newline at end of file +fdb18069e20fba6cc15d31875c2ddd2d \ No newline at end of file diff --git a/inherit_graph_20.map b/inherit_graph_20.map index 7be69daa83..aa53b25f42 100644 --- a/inherit_graph_20.map +++ b/inherit_graph_20.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_20.md5 b/inherit_graph_20.md5 index 7d6695f89b..6624c2021d 100644 --- a/inherit_graph_20.md5 +++ b/inherit_graph_20.md5 @@ -1 +1 @@ -077af19d79f085da5395728ebc5dc6e9 \ No newline at end of file +3689ae28d3df6a6f95e5014f9d4ddc8a \ No newline at end of file diff --git a/inherit_graph_20.png b/inherit_graph_20.png index 3e6682603f..7d8a496f90 100644 Binary files a/inherit_graph_20.png and b/inherit_graph_20.png differ diff --git a/inherit_graph_21.map b/inherit_graph_21.map index a2f1fa0627..1fddac7fe1 100644 --- a/inherit_graph_21.map +++ b/inherit_graph_21.map @@ -1,4 +1,5 @@ - - + + + diff --git a/inherit_graph_21.md5 b/inherit_graph_21.md5 index de38b527f5..1d151724bf 100644 --- a/inherit_graph_21.md5 +++ b/inherit_graph_21.md5 @@ -1 +1 @@ -b5073534fee503e67602e4a7b905679a \ No newline at end of file +831a4caa31f378bc12f60d7d564508d2 \ No newline at end of file diff --git a/inherit_graph_21.png b/inherit_graph_21.png index 32b388a946..68f37924ed 100644 Binary files a/inherit_graph_21.png and b/inherit_graph_21.png differ diff --git a/inherit_graph_22.map b/inherit_graph_22.map index aa53b25f42..f84107c120 100644 --- a/inherit_graph_22.map +++ b/inherit_graph_22.map @@ -1,4 +1,5 @@ - - + + + diff --git a/inherit_graph_22.md5 b/inherit_graph_22.md5 index 6624c2021d..4a232d5bfb 100644 --- a/inherit_graph_22.md5 +++ b/inherit_graph_22.md5 @@ -1 +1 @@ -3689ae28d3df6a6f95e5014f9d4ddc8a \ No newline at end of file +c0a022d0e675bd3eab690050e8400c92 \ No newline at end of file diff --git a/inherit_graph_22.png b/inherit_graph_22.png index 7d8a496f90..ad2df959a5 100644 Binary files a/inherit_graph_22.png and b/inherit_graph_22.png differ diff --git a/inherit_graph_23.map b/inherit_graph_23.map index 1fddac7fe1..14f0b76c98 100644 --- a/inherit_graph_23.map +++ b/inherit_graph_23.map @@ -1,5 +1,6 @@ - - - + + + + diff --git a/inherit_graph_23.md5 b/inherit_graph_23.md5 index 1d151724bf..492a27e9b4 100644 --- a/inherit_graph_23.md5 +++ b/inherit_graph_23.md5 @@ -1 +1 @@ -831a4caa31f378bc12f60d7d564508d2 \ No newline at end of file +a7c8b3bd922ea7dc0bcd4c87960993dc \ No newline at end of file diff --git a/inherit_graph_23.png b/inherit_graph_23.png index 68f37924ed..5119a87c9a 100644 Binary files a/inherit_graph_23.png and b/inherit_graph_23.png differ diff --git a/inherit_graph_24.map b/inherit_graph_24.map index f84107c120..6f5c5a369f 100644 --- a/inherit_graph_24.map +++ b/inherit_graph_24.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/inherit_graph_24.md5 b/inherit_graph_24.md5 index 4a232d5bfb..a613cb89a9 100644 --- a/inherit_graph_24.md5 +++ b/inherit_graph_24.md5 @@ -1 +1 @@ -c0a022d0e675bd3eab690050e8400c92 \ No newline at end of file +45f7daabb4038badf543bbfcf9b98090 \ No newline at end of file diff --git a/inherit_graph_24.png b/inherit_graph_24.png index ad2df959a5..728deb664e 100644 Binary files a/inherit_graph_24.png and b/inherit_graph_24.png differ diff --git a/inherit_graph_25.map b/inherit_graph_25.map index 14f0b76c98..77d261e7fc 100644 --- a/inherit_graph_25.map +++ b/inherit_graph_25.map @@ -1,6 +1,5 @@ - - - - + + + diff --git a/inherit_graph_25.md5 b/inherit_graph_25.md5 index 492a27e9b4..f215f10d0f 100644 --- a/inherit_graph_25.md5 +++ b/inherit_graph_25.md5 @@ -1 +1 @@ -a7c8b3bd922ea7dc0bcd4c87960993dc \ No newline at end of file +c8a8ab71c3e0e73ebfb56a38e6ad91eb \ No newline at end of file diff --git a/inherit_graph_25.png b/inherit_graph_25.png index 5119a87c9a..6f4a7851bc 100644 Binary files a/inherit_graph_25.png and b/inherit_graph_25.png differ diff --git a/inherit_graph_26.map b/inherit_graph_26.map index 6f5c5a369f..062463c276 100644 --- a/inherit_graph_26.map +++ b/inherit_graph_26.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/inherit_graph_26.md5 b/inherit_graph_26.md5 index a613cb89a9..9b65d902d8 100644 --- a/inherit_graph_26.md5 +++ b/inherit_graph_26.md5 @@ -1 +1 @@ -45f7daabb4038badf543bbfcf9b98090 \ No newline at end of file +af755722af72a890f4ad59ebd4f03eb6 \ No newline at end of file diff --git a/inherit_graph_26.png b/inherit_graph_26.png index 728deb664e..2549e1226f 100644 Binary files a/inherit_graph_26.png and b/inherit_graph_26.png differ diff --git a/inherit_graph_27.map b/inherit_graph_27.map index 77d261e7fc..7c15d48806 100644 --- a/inherit_graph_27.map +++ b/inherit_graph_27.map @@ -1,5 +1,6 @@ - - - + + + + diff --git a/inherit_graph_27.md5 b/inherit_graph_27.md5 index f215f10d0f..33b95e7573 100644 --- a/inherit_graph_27.md5 +++ b/inherit_graph_27.md5 @@ -1 +1 @@ -c8a8ab71c3e0e73ebfb56a38e6ad91eb \ No newline at end of file +b86e25029acdf40b97eaad23caa557e8 \ No newline at end of file diff --git a/inherit_graph_27.png b/inherit_graph_27.png index 6f4a7851bc..a2f6e3f3ee 100644 Binary files a/inherit_graph_27.png and b/inherit_graph_27.png differ diff --git a/inherit_graph_28.map b/inherit_graph_28.map index 062463c276..d1fddfc949 100644 --- a/inherit_graph_28.map +++ b/inherit_graph_28.map @@ -1,5 +1,3 @@ - - - + diff --git a/inherit_graph_28.md5 b/inherit_graph_28.md5 index 9b65d902d8..2b45be053c 100644 --- a/inherit_graph_28.md5 +++ b/inherit_graph_28.md5 @@ -1 +1 @@ -af755722af72a890f4ad59ebd4f03eb6 \ No newline at end of file +302adbb993cb1290273df2a357d76d4f \ No newline at end of file diff --git a/inherit_graph_28.png b/inherit_graph_28.png index 2549e1226f..5d163fa490 100644 Binary files a/inherit_graph_28.png and b/inherit_graph_28.png differ diff --git a/inherit_graph_29.map b/inherit_graph_29.map index 7c15d48806..f3a47cb392 100644 --- a/inherit_graph_29.map +++ b/inherit_graph_29.map @@ -1,6 +1,8 @@ - - - - + + + + + + diff --git a/inherit_graph_29.md5 b/inherit_graph_29.md5 index 33b95e7573..409208f547 100644 --- a/inherit_graph_29.md5 +++ b/inherit_graph_29.md5 @@ -1 +1 @@ -b86e25029acdf40b97eaad23caa557e8 \ No newline at end of file +6f700be7b772b7208d269cd1c06d3db3 \ No newline at end of file diff --git a/inherit_graph_29.png b/inherit_graph_29.png index a2f6e3f3ee..a2c898c556 100644 Binary files a/inherit_graph_29.png and b/inherit_graph_29.png differ diff --git a/inherit_graph_3.map b/inherit_graph_3.map index 7568ab8008..1b526081e6 100644 --- a/inherit_graph_3.map +++ b/inherit_graph_3.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_3.md5 b/inherit_graph_3.md5 index eac8a8f586..cec150afeb 100644 --- a/inherit_graph_3.md5 +++ b/inherit_graph_3.md5 @@ -1 +1 @@ -5eece1a45d32983bdd5cf7b2301e0bcf \ No newline at end of file +33f9e556f4e928d572f5a4f69e74c7d2 \ No newline at end of file diff --git a/inherit_graph_3.png b/inherit_graph_3.png index ef839bbfd1..e9223a4e98 100644 Binary files a/inherit_graph_3.png and b/inherit_graph_3.png differ diff --git a/inherit_graph_30.map b/inherit_graph_30.map index d1fddfc949..74103cd085 100644 --- a/inherit_graph_30.map +++ b/inherit_graph_30.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_30.md5 b/inherit_graph_30.md5 index 2b45be053c..2ad7dbcc25 100644 --- a/inherit_graph_30.md5 +++ b/inherit_graph_30.md5 @@ -1 +1 @@ -302adbb993cb1290273df2a357d76d4f \ No newline at end of file +56b3f15798df1d35302c13d47f8d4544 \ No newline at end of file diff --git a/inherit_graph_30.png b/inherit_graph_30.png index 5d163fa490..03ad861512 100644 Binary files a/inherit_graph_30.png and b/inherit_graph_30.png differ diff --git a/inherit_graph_31.map b/inherit_graph_31.map index f3a47cb392..f464fb742c 100644 --- a/inherit_graph_31.map +++ b/inherit_graph_31.map @@ -1,8 +1,3 @@ - - - - - - + diff --git a/inherit_graph_31.md5 b/inherit_graph_31.md5 index 409208f547..b63a6b8978 100644 --- a/inherit_graph_31.md5 +++ b/inherit_graph_31.md5 @@ -1 +1 @@ -6f700be7b772b7208d269cd1c06d3db3 \ No newline at end of file +8e59f13b8d05396b86dee4ca23de6da5 \ No newline at end of file diff --git a/inherit_graph_31.png b/inherit_graph_31.png index a2c898c556..b2516d0a22 100644 Binary files a/inherit_graph_31.png and b/inherit_graph_31.png differ diff --git a/inherit_graph_32.map b/inherit_graph_32.map index 2619ea2332..97535dd9a6 100644 --- a/inherit_graph_32.map +++ b/inherit_graph_32.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_32.md5 b/inherit_graph_32.md5 index 829ec422a5..7d67951307 100644 --- a/inherit_graph_32.md5 +++ b/inherit_graph_32.md5 @@ -1 +1 @@ -04b1f78f99cb192189b210fc078b50d5 \ No newline at end of file +31a5e5eb6995f5f83606baffb530c1f0 \ No newline at end of file diff --git a/inherit_graph_32.png b/inherit_graph_32.png index 9c8f9ca051..aa6eb1cb1e 100644 Binary files a/inherit_graph_32.png and b/inherit_graph_32.png differ diff --git a/inherit_graph_33.map b/inherit_graph_33.map index 6e76cce2c6..6b34313dfb 100644 --- a/inherit_graph_33.map +++ b/inherit_graph_33.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_33.md5 b/inherit_graph_33.md5 index 6eac97670f..65f2dd1199 100644 --- a/inherit_graph_33.md5 +++ b/inherit_graph_33.md5 @@ -1 +1 @@ -f644551c6da29c484b6311b819b949e9 \ No newline at end of file +1638c43d4e07b8703ad01569ec38959c \ No newline at end of file diff --git a/inherit_graph_33.png b/inherit_graph_33.png index 20b726ab72..b8d0392695 100644 Binary files a/inherit_graph_33.png and b/inherit_graph_33.png differ diff --git a/inherit_graph_34.map b/inherit_graph_34.map index 74103cd085..0c7ac89702 100644 --- a/inherit_graph_34.map +++ b/inherit_graph_34.map @@ -1,3 +1,16 @@ - + + + + + + + + + + + + + + diff --git a/inherit_graph_34.md5 b/inherit_graph_34.md5 index 2ad7dbcc25..e311cfe2e5 100644 --- a/inherit_graph_34.md5 +++ b/inherit_graph_34.md5 @@ -1 +1 @@ -56b3f15798df1d35302c13d47f8d4544 \ No newline at end of file +b926c07a2ebdc0282f85a44c4e39e042 \ No newline at end of file diff --git a/inherit_graph_34.png b/inherit_graph_34.png index 03ad861512..e1839ff709 100644 Binary files a/inherit_graph_34.png and b/inherit_graph_34.png differ diff --git a/inherit_graph_35.map b/inherit_graph_35.map index f464fb742c..48178744d7 100644 --- a/inherit_graph_35.map +++ b/inherit_graph_35.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_35.md5 b/inherit_graph_35.md5 index b63a6b8978..43a585bf66 100644 --- a/inherit_graph_35.md5 +++ b/inherit_graph_35.md5 @@ -1 +1 @@ -8e59f13b8d05396b86dee4ca23de6da5 \ No newline at end of file +7b52f1280680279f0deffb958318475b \ No newline at end of file diff --git a/inherit_graph_35.png b/inherit_graph_35.png index b2516d0a22..5f31e1cb32 100644 Binary files a/inherit_graph_35.png and b/inherit_graph_35.png differ diff --git a/inherit_graph_36.map b/inherit_graph_36.map index 44c16b40af..ae109ae444 100644 --- a/inherit_graph_36.map +++ b/inherit_graph_36.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_36.md5 b/inherit_graph_36.md5 index ec66dab558..d200148805 100644 --- a/inherit_graph_36.md5 +++ b/inherit_graph_36.md5 @@ -1 +1 @@ -ed779c360de146a166846210c8f46a08 \ No newline at end of file +fe3714356f2d51f138279180be2f6fd5 \ No newline at end of file diff --git a/inherit_graph_36.png b/inherit_graph_36.png index 0240f2034d..e58de5f6af 100644 Binary files a/inherit_graph_36.png and b/inherit_graph_36.png differ diff --git a/inherit_graph_37.map b/inherit_graph_37.map index 97535dd9a6..91bdc6a599 100644 --- a/inherit_graph_37.map +++ b/inherit_graph_37.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_37.md5 b/inherit_graph_37.md5 index 7d67951307..7506237744 100644 --- a/inherit_graph_37.md5 +++ b/inherit_graph_37.md5 @@ -1 +1 @@ -31a5e5eb6995f5f83606baffb530c1f0 \ No newline at end of file +bd7dfda9c515aebdc08d00cb633cd844 \ No newline at end of file diff --git a/inherit_graph_37.png b/inherit_graph_37.png index aa6eb1cb1e..04fd86c283 100644 Binary files a/inherit_graph_37.png and b/inherit_graph_37.png differ diff --git a/inherit_graph_38.map b/inherit_graph_38.map index 5420b3181d..a528c98209 100644 --- a/inherit_graph_38.map +++ b/inherit_graph_38.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_38.md5 b/inherit_graph_38.md5 index f27abaaa49..0cce7de606 100644 --- a/inherit_graph_38.md5 +++ b/inherit_graph_38.md5 @@ -1 +1 @@ -9c9f143a72accb5c262b305d106137f2 \ No newline at end of file +4f44f129d459b46bde3d6cbb698c591c \ No newline at end of file diff --git a/inherit_graph_38.png b/inherit_graph_38.png index 3381c213a5..10d7382f9d 100644 Binary files a/inherit_graph_38.png and b/inherit_graph_38.png differ diff --git a/inherit_graph_39.map b/inherit_graph_39.map index 6b34313dfb..5124354315 100644 --- a/inherit_graph_39.map +++ b/inherit_graph_39.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_39.md5 b/inherit_graph_39.md5 index 65f2dd1199..2dd5c1212c 100644 --- a/inherit_graph_39.md5 +++ b/inherit_graph_39.md5 @@ -1 +1 @@ -1638c43d4e07b8703ad01569ec38959c \ No newline at end of file +7f5f19289eff0e9d20f788b1a7e94a58 \ No newline at end of file diff --git a/inherit_graph_39.png b/inherit_graph_39.png index b8d0392695..f66e94efc0 100644 Binary files a/inherit_graph_39.png and b/inherit_graph_39.png differ diff --git a/inherit_graph_4.map b/inherit_graph_4.map index 1b526081e6..63f61c97d1 100644 --- a/inherit_graph_4.map +++ b/inherit_graph_4.map @@ -1,4 +1,5 @@ - - + + + diff --git a/inherit_graph_4.md5 b/inherit_graph_4.md5 index cec150afeb..ff207149cc 100644 --- a/inherit_graph_4.md5 +++ b/inherit_graph_4.md5 @@ -1 +1 @@ -33f9e556f4e928d572f5a4f69e74c7d2 \ No newline at end of file +cba7f1349fa860af939f689bd613f490 \ No newline at end of file diff --git a/inherit_graph_4.png b/inherit_graph_4.png index e9223a4e98..5c87d1bcbb 100644 Binary files a/inherit_graph_4.png and b/inherit_graph_4.png differ diff --git a/inherit_graph_40.map b/inherit_graph_40.map index 0c7ac89702..bb8fd0787f 100644 --- a/inherit_graph_40.map +++ b/inherit_graph_40.map @@ -1,16 +1,4 @@ - - - - - - - - - - - - - - + + diff --git a/inherit_graph_40.md5 b/inherit_graph_40.md5 index e311cfe2e5..d97ebd5622 100644 --- a/inherit_graph_40.md5 +++ b/inherit_graph_40.md5 @@ -1 +1 @@ -b926c07a2ebdc0282f85a44c4e39e042 \ No newline at end of file +4529cbc591462b5e9b8e6c4ba19f54dc \ No newline at end of file diff --git a/inherit_graph_40.png b/inherit_graph_40.png index e1839ff709..ab9416aaa2 100644 Binary files a/inherit_graph_40.png and b/inherit_graph_40.png differ diff --git a/inherit_graph_41.map b/inherit_graph_41.map index 48178744d7..9793d13205 100644 --- a/inherit_graph_41.map +++ b/inherit_graph_41.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_41.md5 b/inherit_graph_41.md5 index 43a585bf66..7d8feae429 100644 --- a/inherit_graph_41.md5 +++ b/inherit_graph_41.md5 @@ -1 +1 @@ -7b52f1280680279f0deffb958318475b \ No newline at end of file +ac64076e6d7048308b7cb765fe04af31 \ No newline at end of file diff --git a/inherit_graph_41.png b/inherit_graph_41.png index 5f31e1cb32..04fbab2c40 100644 Binary files a/inherit_graph_41.png and b/inherit_graph_41.png differ diff --git a/inherit_graph_42.map b/inherit_graph_42.map index ae109ae444..a951113d2f 100644 --- a/inherit_graph_42.map +++ b/inherit_graph_42.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_42.md5 b/inherit_graph_42.md5 index d200148805..87d7042137 100644 --- a/inherit_graph_42.md5 +++ b/inherit_graph_42.md5 @@ -1 +1 @@ -fe3714356f2d51f138279180be2f6fd5 \ No newline at end of file +eeeefa19078ea284722ebb58a6899e12 \ No newline at end of file diff --git a/inherit_graph_42.png b/inherit_graph_42.png index e58de5f6af..d51aef3916 100644 Binary files a/inherit_graph_42.png and b/inherit_graph_42.png differ diff --git a/inherit_graph_43.map b/inherit_graph_43.map index 91bdc6a599..9ed7127356 100644 --- a/inherit_graph_43.map +++ b/inherit_graph_43.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_43.md5 b/inherit_graph_43.md5 index 7506237744..34f9056be1 100644 --- a/inherit_graph_43.md5 +++ b/inherit_graph_43.md5 @@ -1 +1 @@ -bd7dfda9c515aebdc08d00cb633cd844 \ No newline at end of file +f7872b0c6d9fda92c2d3dbc731d65504 \ No newline at end of file diff --git a/inherit_graph_43.png b/inherit_graph_43.png index 04fd86c283..b20c161169 100644 Binary files a/inherit_graph_43.png and b/inherit_graph_43.png differ diff --git a/inherit_graph_44.map b/inherit_graph_44.map index a528c98209..e46b16d0f7 100644 --- a/inherit_graph_44.map +++ b/inherit_graph_44.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_44.md5 b/inherit_graph_44.md5 index 0cce7de606..048252208f 100644 --- a/inherit_graph_44.md5 +++ b/inherit_graph_44.md5 @@ -1 +1 @@ -4f44f129d459b46bde3d6cbb698c591c \ No newline at end of file +fb44c5394fb9bf1b542e9bc8b2105197 \ No newline at end of file diff --git a/inherit_graph_44.png b/inherit_graph_44.png index 10d7382f9d..413faab5b0 100644 Binary files a/inherit_graph_44.png and b/inherit_graph_44.png differ diff --git a/inherit_graph_45.map b/inherit_graph_45.map index 5124354315..ecccb648f3 100644 --- a/inherit_graph_45.map +++ b/inherit_graph_45.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_45.md5 b/inherit_graph_45.md5 index 2dd5c1212c..3ef8453f3a 100644 --- a/inherit_graph_45.md5 +++ b/inherit_graph_45.md5 @@ -1 +1 @@ -7f5f19289eff0e9d20f788b1a7e94a58 \ No newline at end of file +5c395f3b06e7f0cad776e9b3e5e25997 \ No newline at end of file diff --git a/inherit_graph_45.png b/inherit_graph_45.png index f66e94efc0..b3f9555a04 100644 Binary files a/inherit_graph_45.png and b/inherit_graph_45.png differ diff --git a/inherit_graph_46.map b/inherit_graph_46.map index bb8fd0787f..60135eb852 100644 --- a/inherit_graph_46.map +++ b/inherit_graph_46.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_46.md5 b/inherit_graph_46.md5 index d97ebd5622..b76c6df24f 100644 --- a/inherit_graph_46.md5 +++ b/inherit_graph_46.md5 @@ -1 +1 @@ -4529cbc591462b5e9b8e6c4ba19f54dc \ No newline at end of file +c25e77a2dc5ec1b71f56a2c77c447f76 \ No newline at end of file diff --git a/inherit_graph_46.png b/inherit_graph_46.png index ab9416aaa2..5450e46e91 100644 Binary files a/inherit_graph_46.png and b/inherit_graph_46.png differ diff --git a/inherit_graph_47.map b/inherit_graph_47.map index 9793d13205..70e2473340 100644 --- a/inherit_graph_47.map +++ b/inherit_graph_47.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_47.md5 b/inherit_graph_47.md5 index 7d8feae429..27d6a708f9 100644 --- a/inherit_graph_47.md5 +++ b/inherit_graph_47.md5 @@ -1 +1 @@ -ac64076e6d7048308b7cb765fe04af31 \ No newline at end of file +8ec639b2ae29ec037521b4ea742b1403 \ No newline at end of file diff --git a/inherit_graph_47.png b/inherit_graph_47.png index 04fbab2c40..9443cb1853 100644 Binary files a/inherit_graph_47.png and b/inherit_graph_47.png differ diff --git a/inherit_graph_48.map b/inherit_graph_48.map index a951113d2f..7fbedb3969 100644 --- a/inherit_graph_48.map +++ b/inherit_graph_48.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_48.md5 b/inherit_graph_48.md5 index 87d7042137..b7b8bcf055 100644 --- a/inherit_graph_48.md5 +++ b/inherit_graph_48.md5 @@ -1 +1 @@ -eeeefa19078ea284722ebb58a6899e12 \ No newline at end of file +20d558335868781d867b7b62a17b2e0f \ No newline at end of file diff --git a/inherit_graph_48.png b/inherit_graph_48.png index d51aef3916..baa7e5336e 100644 Binary files a/inherit_graph_48.png and b/inherit_graph_48.png differ diff --git a/inherit_graph_49.map b/inherit_graph_49.map index 9ed7127356..123f4f0436 100644 --- a/inherit_graph_49.map +++ b/inherit_graph_49.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_49.md5 b/inherit_graph_49.md5 index 34f9056be1..8466fde9ab 100644 --- a/inherit_graph_49.md5 +++ b/inherit_graph_49.md5 @@ -1 +1 @@ -f7872b0c6d9fda92c2d3dbc731d65504 \ No newline at end of file +b671119cb392b0e489a482063796cb3a \ No newline at end of file diff --git a/inherit_graph_49.png b/inherit_graph_49.png index b20c161169..f38702cec9 100644 Binary files a/inherit_graph_49.png and b/inherit_graph_49.png differ diff --git a/inherit_graph_5.map b/inherit_graph_5.map index 63f61c97d1..947edbce6f 100644 --- a/inherit_graph_5.map +++ b/inherit_graph_5.map @@ -1,5 +1,6 @@ - - - + + + + diff --git a/inherit_graph_5.md5 b/inherit_graph_5.md5 index ff207149cc..5138490410 100644 --- a/inherit_graph_5.md5 +++ b/inherit_graph_5.md5 @@ -1 +1 @@ -cba7f1349fa860af939f689bd613f490 \ No newline at end of file +f44e1a87b87dc03fdf001203445f75da \ No newline at end of file diff --git a/inherit_graph_5.png b/inherit_graph_5.png index 5c87d1bcbb..04047ab32e 100644 Binary files a/inherit_graph_5.png and b/inherit_graph_5.png differ diff --git a/inherit_graph_50.map b/inherit_graph_50.map index 6ff9e86b87..260771c317 100644 --- a/inherit_graph_50.map +++ b/inherit_graph_50.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_50.md5 b/inherit_graph_50.md5 index a9aba66ae9..55fd8fa141 100644 --- a/inherit_graph_50.md5 +++ b/inherit_graph_50.md5 @@ -1 +1 @@ -223099ba8a5d097635e66cc00abe7543 \ No newline at end of file +7d3dbd962b07a55f88d51c1f54d2ac2d \ No newline at end of file diff --git a/inherit_graph_50.png b/inherit_graph_50.png index 2c0dc6a329..6778d847ea 100644 Binary files a/inherit_graph_50.png and b/inherit_graph_50.png differ diff --git a/inherit_graph_51.map b/inherit_graph_51.map index e46b16d0f7..d3237e811b 100644 --- a/inherit_graph_51.map +++ b/inherit_graph_51.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_51.md5 b/inherit_graph_51.md5 index 048252208f..4258c41a38 100644 --- a/inherit_graph_51.md5 +++ b/inherit_graph_51.md5 @@ -1 +1 @@ -fb44c5394fb9bf1b542e9bc8b2105197 \ No newline at end of file +ac535574a08a215b7683195a37bcf84a \ No newline at end of file diff --git a/inherit_graph_51.png b/inherit_graph_51.png index 413faab5b0..461365221c 100644 Binary files a/inherit_graph_51.png and b/inherit_graph_51.png differ diff --git a/inherit_graph_52.map b/inherit_graph_52.map index ecccb648f3..7481c26a3e 100644 --- a/inherit_graph_52.map +++ b/inherit_graph_52.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_52.md5 b/inherit_graph_52.md5 index 3ef8453f3a..dd1393c930 100644 --- a/inherit_graph_52.md5 +++ b/inherit_graph_52.md5 @@ -1 +1 @@ -5c395f3b06e7f0cad776e9b3e5e25997 \ No newline at end of file +8c9678b4853b2b741aa92109d7f6d207 \ No newline at end of file diff --git a/inherit_graph_52.png b/inherit_graph_52.png index b3f9555a04..d36a0f9caa 100644 Binary files a/inherit_graph_52.png and b/inherit_graph_52.png differ diff --git a/inherit_graph_53.map b/inherit_graph_53.map index 60135eb852..349f4f4e9a 100644 --- a/inherit_graph_53.map +++ b/inherit_graph_53.map @@ -1,4 +1,9 @@ - - + + + + + + + diff --git a/inherit_graph_53.md5 b/inherit_graph_53.md5 index b76c6df24f..ef3f082c8e 100644 --- a/inherit_graph_53.md5 +++ b/inherit_graph_53.md5 @@ -1 +1 @@ -c25e77a2dc5ec1b71f56a2c77c447f76 \ No newline at end of file +95284518f9cc77243de79b38f429713b \ No newline at end of file diff --git a/inherit_graph_53.png b/inherit_graph_53.png index 5450e46e91..d5cbccc401 100644 Binary files a/inherit_graph_53.png and b/inherit_graph_53.png differ diff --git a/inherit_graph_54.map b/inherit_graph_54.map index 70e2473340..71f0ce52fd 100644 --- a/inherit_graph_54.map +++ b/inherit_graph_54.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_54.md5 b/inherit_graph_54.md5 index 27d6a708f9..3a13539d85 100644 --- a/inherit_graph_54.md5 +++ b/inherit_graph_54.md5 @@ -1 +1 @@ -8ec639b2ae29ec037521b4ea742b1403 \ No newline at end of file +d2e7e1f23d3d8656b8dc9a1d9c68532d \ No newline at end of file diff --git a/inherit_graph_54.png b/inherit_graph_54.png index 9443cb1853..5f39ba6357 100644 Binary files a/inherit_graph_54.png and b/inherit_graph_54.png differ diff --git a/inherit_graph_55.map b/inherit_graph_55.map index 7fbedb3969..8c38bf6dae 100644 --- a/inherit_graph_55.map +++ b/inherit_graph_55.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_55.md5 b/inherit_graph_55.md5 index b7b8bcf055..ab7c63530c 100644 --- a/inherit_graph_55.md5 +++ b/inherit_graph_55.md5 @@ -1 +1 @@ -20d558335868781d867b7b62a17b2e0f \ No newline at end of file +163b364fb97bcc593118a05ec36a9df0 \ No newline at end of file diff --git a/inherit_graph_55.png b/inherit_graph_55.png index baa7e5336e..fdcd543420 100644 Binary files a/inherit_graph_55.png and b/inherit_graph_55.png differ diff --git a/inherit_graph_56.map b/inherit_graph_56.map index 123f4f0436..98346a527f 100644 --- a/inherit_graph_56.map +++ b/inherit_graph_56.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_56.md5 b/inherit_graph_56.md5 index 8466fde9ab..2bb7455953 100644 --- a/inherit_graph_56.md5 +++ b/inherit_graph_56.md5 @@ -1 +1 @@ -b671119cb392b0e489a482063796cb3a \ No newline at end of file +183f38081e0034da8b2efab66ea01ae5 \ No newline at end of file diff --git a/inherit_graph_56.png b/inherit_graph_56.png index f38702cec9..3669696561 100644 Binary files a/inherit_graph_56.png and b/inherit_graph_56.png differ diff --git a/inherit_graph_57.map b/inherit_graph_57.map index ef05da2adf..96fa006e62 100644 --- a/inherit_graph_57.map +++ b/inherit_graph_57.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_57.md5 b/inherit_graph_57.md5 index 6408c52574..5648aaecc6 100644 --- a/inherit_graph_57.md5 +++ b/inherit_graph_57.md5 @@ -1 +1 @@ -d997f65755aaeb8b979c154b04b3e877 \ No newline at end of file +8cba5fba04513e57d58b66f3dd18f494 \ No newline at end of file diff --git a/inherit_graph_57.png b/inherit_graph_57.png index fd4b099bc0..f0c187e12b 100644 Binary files a/inherit_graph_57.png and b/inherit_graph_57.png differ diff --git a/inherit_graph_58.map b/inherit_graph_58.map index 379d6da537..0c6f045191 100644 --- a/inherit_graph_58.map +++ b/inherit_graph_58.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_58.md5 b/inherit_graph_58.md5 index d786b86d5b..ba254a9d35 100644 --- a/inherit_graph_58.md5 +++ b/inherit_graph_58.md5 @@ -1 +1 @@ -2d5e8211a28c0ef05ceea70b0e3d3914 \ No newline at end of file +12612d48dfb21c52278963d415b912f8 \ No newline at end of file diff --git a/inherit_graph_58.png b/inherit_graph_58.png index b89b5c5cf6..1f3c9677a2 100644 Binary files a/inherit_graph_58.png and b/inherit_graph_58.png differ diff --git a/inherit_graph_59.map b/inherit_graph_59.map index 00b756108e..01191e37eb 100644 --- a/inherit_graph_59.map +++ b/inherit_graph_59.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_59.md5 b/inherit_graph_59.md5 index aadff183cc..2973c3519d 100644 --- a/inherit_graph_59.md5 +++ b/inherit_graph_59.md5 @@ -1 +1 @@ -2aff7bbd219ae727294814ed3995552a \ No newline at end of file +3a0ba25cd793d9464b0ea31874514b62 \ No newline at end of file diff --git a/inherit_graph_59.png b/inherit_graph_59.png index f977ebc736..922f0ae18a 100644 Binary files a/inherit_graph_59.png and b/inherit_graph_59.png differ diff --git a/inherit_graph_6.map b/inherit_graph_6.map index 947edbce6f..ccfce6a4bc 100644 --- a/inherit_graph_6.map +++ b/inherit_graph_6.map @@ -1,6 +1,5 @@ - - - - + + + diff --git a/inherit_graph_6.md5 b/inherit_graph_6.md5 index 5138490410..0d63788a18 100644 --- a/inherit_graph_6.md5 +++ b/inherit_graph_6.md5 @@ -1 +1 @@ -f44e1a87b87dc03fdf001203445f75da \ No newline at end of file +2589c15445c2d0ba82ced262bb0cd3e4 \ No newline at end of file diff --git a/inherit_graph_6.png b/inherit_graph_6.png index 04047ab32e..7852096827 100644 Binary files a/inherit_graph_6.png and b/inherit_graph_6.png differ diff --git a/inherit_graph_60.map b/inherit_graph_60.map index 260771c317..2d07798ddc 100644 --- a/inherit_graph_60.map +++ b/inherit_graph_60.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_60.md5 b/inherit_graph_60.md5 index 55fd8fa141..278c277fbe 100644 --- a/inherit_graph_60.md5 +++ b/inherit_graph_60.md5 @@ -1 +1 @@ -7d3dbd962b07a55f88d51c1f54d2ac2d \ No newline at end of file +009a9252a04d648b90a8e4e25c948eb6 \ No newline at end of file diff --git a/inherit_graph_60.png b/inherit_graph_60.png index 6778d847ea..9e26ca3804 100644 Binary files a/inherit_graph_60.png and b/inherit_graph_60.png differ diff --git a/inherit_graph_61.map b/inherit_graph_61.map index d3237e811b..72242758e8 100644 --- a/inherit_graph_61.map +++ b/inherit_graph_61.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_61.md5 b/inherit_graph_61.md5 index 4258c41a38..652e73d861 100644 --- a/inherit_graph_61.md5 +++ b/inherit_graph_61.md5 @@ -1 +1 @@ -ac535574a08a215b7683195a37bcf84a \ No newline at end of file +010da06a6c37eeb14dfe2dfe8ef8f864 \ No newline at end of file diff --git a/inherit_graph_61.png b/inherit_graph_61.png index 461365221c..0e42c68cd5 100644 Binary files a/inherit_graph_61.png and b/inherit_graph_61.png differ diff --git a/inherit_graph_62.map b/inherit_graph_62.map index 7481c26a3e..0f47abfae8 100644 --- a/inherit_graph_62.map +++ b/inherit_graph_62.map @@ -1,3 +1,8 @@ - + + + + + + diff --git a/inherit_graph_62.md5 b/inherit_graph_62.md5 index dd1393c930..4737c54127 100644 --- a/inherit_graph_62.md5 +++ b/inherit_graph_62.md5 @@ -1 +1 @@ -8c9678b4853b2b741aa92109d7f6d207 \ No newline at end of file +218d1b0095ab5ae040918265834dc86e \ No newline at end of file diff --git a/inherit_graph_62.png b/inherit_graph_62.png index d36a0f9caa..4ce3794aaf 100644 Binary files a/inherit_graph_62.png and b/inherit_graph_62.png differ diff --git a/inherit_graph_63.map b/inherit_graph_63.map index 349f4f4e9a..eb06d3b4c4 100644 --- a/inherit_graph_63.map +++ b/inherit_graph_63.map @@ -1,9 +1,5 @@ - - - - - - - + + + diff --git a/inherit_graph_63.md5 b/inherit_graph_63.md5 index ef3f082c8e..296a680f84 100644 --- a/inherit_graph_63.md5 +++ b/inherit_graph_63.md5 @@ -1 +1 @@ -95284518f9cc77243de79b38f429713b \ No newline at end of file +13e05c821963d9385a5e1f098101af62 \ No newline at end of file diff --git a/inherit_graph_63.png b/inherit_graph_63.png index d5cbccc401..eaa05b2137 100644 Binary files a/inherit_graph_63.png and b/inherit_graph_63.png differ diff --git a/inherit_graph_64.map b/inherit_graph_64.map index 71f0ce52fd..1aa102df55 100644 --- a/inherit_graph_64.map +++ b/inherit_graph_64.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_64.md5 b/inherit_graph_64.md5 index 3a13539d85..b02b092cec 100644 --- a/inherit_graph_64.md5 +++ b/inherit_graph_64.md5 @@ -1 +1 @@ -d2e7e1f23d3d8656b8dc9a1d9c68532d \ No newline at end of file +a459960abbd8ceb9c3cfc8dacc286308 \ No newline at end of file diff --git a/inherit_graph_64.png b/inherit_graph_64.png index 5f39ba6357..d54c4cbfd4 100644 Binary files a/inherit_graph_64.png and b/inherit_graph_64.png differ diff --git a/inherit_graph_65.map b/inherit_graph_65.map index 8c38bf6dae..ea3ca70c7c 100644 --- a/inherit_graph_65.map +++ b/inherit_graph_65.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_65.md5 b/inherit_graph_65.md5 index ab7c63530c..82310693a3 100644 --- a/inherit_graph_65.md5 +++ b/inherit_graph_65.md5 @@ -1 +1 @@ -163b364fb97bcc593118a05ec36a9df0 \ No newline at end of file +37274f14eb9421a0c1f42c67d3d0be68 \ No newline at end of file diff --git a/inherit_graph_65.png b/inherit_graph_65.png index fdcd543420..8409ef99b1 100644 Binary files a/inherit_graph_65.png and b/inherit_graph_65.png differ diff --git a/inherit_graph_66.map b/inherit_graph_66.map index 98346a527f..c266159932 100644 --- a/inherit_graph_66.map +++ b/inherit_graph_66.map @@ -1,4 +1,5 @@ - - + + + diff --git a/inherit_graph_66.md5 b/inherit_graph_66.md5 index 2bb7455953..8be47ec7f6 100644 --- a/inherit_graph_66.md5 +++ b/inherit_graph_66.md5 @@ -1 +1 @@ -183f38081e0034da8b2efab66ea01ae5 \ No newline at end of file +ca3d6a2e1cf856c662c8c459ab5cfcd5 \ No newline at end of file diff --git a/inherit_graph_66.png b/inherit_graph_66.png index 3669696561..c000d571b5 100644 Binary files a/inherit_graph_66.png and b/inherit_graph_66.png differ diff --git a/inherit_graph_67.map b/inherit_graph_67.map index 96fa006e62..fd8b3db694 100644 --- a/inherit_graph_67.map +++ b/inherit_graph_67.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_67.md5 b/inherit_graph_67.md5 index 5648aaecc6..4727e14b3e 100644 --- a/inherit_graph_67.md5 +++ b/inherit_graph_67.md5 @@ -1 +1 @@ -8cba5fba04513e57d58b66f3dd18f494 \ No newline at end of file +4ddc5a8f6814a111f47278bbdc317c02 \ No newline at end of file diff --git a/inherit_graph_67.png b/inherit_graph_67.png index f0c187e12b..cb68355dc8 100644 Binary files a/inherit_graph_67.png and b/inherit_graph_67.png differ diff --git a/inherit_graph_68.map b/inherit_graph_68.map index 66d47947d2..6faea1560a 100644 --- a/inherit_graph_68.map +++ b/inherit_graph_68.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_68.md5 b/inherit_graph_68.md5 index 109532d7f6..93fbe11d82 100644 --- a/inherit_graph_68.md5 +++ b/inherit_graph_68.md5 @@ -1 +1 @@ -d033ddf1dd0be01a975971ff66963098 \ No newline at end of file +f3e136512e155e664e88844d9520639e \ No newline at end of file diff --git a/inherit_graph_68.png b/inherit_graph_68.png index ff4ad51d4b..33ec356b41 100644 Binary files a/inherit_graph_68.png and b/inherit_graph_68.png differ diff --git a/inherit_graph_69.map b/inherit_graph_69.map index 0c6f045191..1f1809581d 100644 --- a/inherit_graph_69.map +++ b/inherit_graph_69.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_69.md5 b/inherit_graph_69.md5 index ba254a9d35..d6b4b4b5ca 100644 --- a/inherit_graph_69.md5 +++ b/inherit_graph_69.md5 @@ -1 +1 @@ -12612d48dfb21c52278963d415b912f8 \ No newline at end of file +d4f672b4dcb4aabe319a9d0d6e2ca0e0 \ No newline at end of file diff --git a/inherit_graph_69.png b/inherit_graph_69.png index 1f3c9677a2..2fb33b25ed 100644 Binary files a/inherit_graph_69.png and b/inherit_graph_69.png differ diff --git a/inherit_graph_7.map b/inherit_graph_7.map index ccfce6a4bc..d6533c7a41 100644 --- a/inherit_graph_7.map +++ b/inherit_graph_7.map @@ -1,5 +1,38 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inherit_graph_7.md5 b/inherit_graph_7.md5 index 0d63788a18..a908b31c49 100644 --- a/inherit_graph_7.md5 +++ b/inherit_graph_7.md5 @@ -1 +1 @@ -2589c15445c2d0ba82ced262bb0cd3e4 \ No newline at end of file +70142143335e239d2e5d8562900de905 \ No newline at end of file diff --git a/inherit_graph_7.png b/inherit_graph_7.png index 7852096827..686649c9a2 100644 Binary files a/inherit_graph_7.png and b/inherit_graph_7.png differ diff --git a/inherit_graph_70.map b/inherit_graph_70.map index 01191e37eb..ad85268a1c 100644 --- a/inherit_graph_70.map +++ b/inherit_graph_70.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_70.md5 b/inherit_graph_70.md5 index 2973c3519d..9774fdd15e 100644 --- a/inherit_graph_70.md5 +++ b/inherit_graph_70.md5 @@ -1 +1 @@ -3a0ba25cd793d9464b0ea31874514b62 \ No newline at end of file +363ca6c3ae582816681b0721992bf08a \ No newline at end of file diff --git a/inherit_graph_70.png b/inherit_graph_70.png index 922f0ae18a..0555ee1420 100644 Binary files a/inherit_graph_70.png and b/inherit_graph_70.png differ diff --git a/inherit_graph_71.map b/inherit_graph_71.map index 2d07798ddc..dc81a5a550 100644 --- a/inherit_graph_71.map +++ b/inherit_graph_71.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_71.md5 b/inherit_graph_71.md5 index 278c277fbe..705b5cf534 100644 --- a/inherit_graph_71.md5 +++ b/inherit_graph_71.md5 @@ -1 +1 @@ -009a9252a04d648b90a8e4e25c948eb6 \ No newline at end of file +d901d286683c2ea63190cf79224d0c94 \ No newline at end of file diff --git a/inherit_graph_71.png b/inherit_graph_71.png index 9e26ca3804..bdb8934d47 100644 Binary files a/inherit_graph_71.png and b/inherit_graph_71.png differ diff --git a/inherit_graph_72.map b/inherit_graph_72.map index 72242758e8..950133ef2c 100644 --- a/inherit_graph_72.map +++ b/inherit_graph_72.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_72.md5 b/inherit_graph_72.md5 index 652e73d861..de12dafae0 100644 --- a/inherit_graph_72.md5 +++ b/inherit_graph_72.md5 @@ -1 +1 @@ -010da06a6c37eeb14dfe2dfe8ef8f864 \ No newline at end of file +7369e7efafad4a63f79bdd931539bee9 \ No newline at end of file diff --git a/inherit_graph_72.png b/inherit_graph_72.png index 0e42c68cd5..14bf434a0a 100644 Binary files a/inherit_graph_72.png and b/inherit_graph_72.png differ diff --git a/inherit_graph_73.map b/inherit_graph_73.map index 0f47abfae8..b8a0663293 100644 --- a/inherit_graph_73.map +++ b/inherit_graph_73.map @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/inherit_graph_73.md5 b/inherit_graph_73.md5 index 4737c54127..4af50aaaa2 100644 --- a/inherit_graph_73.md5 +++ b/inherit_graph_73.md5 @@ -1 +1 @@ -218d1b0095ab5ae040918265834dc86e \ No newline at end of file +0f5df2a5cb5a2f62e466ff7fe630f1f7 \ No newline at end of file diff --git a/inherit_graph_73.png b/inherit_graph_73.png index 4ce3794aaf..fca5c77670 100644 Binary files a/inherit_graph_73.png and b/inherit_graph_73.png differ diff --git a/inherit_graph_74.map b/inherit_graph_74.map index eb06d3b4c4..56f12670ec 100644 --- a/inherit_graph_74.map +++ b/inherit_graph_74.map @@ -1,5 +1,3 @@ - - - + diff --git a/inherit_graph_74.md5 b/inherit_graph_74.md5 index 296a680f84..3877edc0f2 100644 --- a/inherit_graph_74.md5 +++ b/inherit_graph_74.md5 @@ -1 +1 @@ -13e05c821963d9385a5e1f098101af62 \ No newline at end of file +d335af1ffde98e2bda1f529a54d81af7 \ No newline at end of file diff --git a/inherit_graph_74.png b/inherit_graph_74.png index eaa05b2137..c6b9e0b0e2 100644 Binary files a/inherit_graph_74.png and b/inherit_graph_74.png differ diff --git a/inherit_graph_75.map b/inherit_graph_75.map index 1aa102df55..eb1c8f31bf 100644 --- a/inherit_graph_75.map +++ b/inherit_graph_75.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_75.md5 b/inherit_graph_75.md5 index b02b092cec..4b736a6a69 100644 --- a/inherit_graph_75.md5 +++ b/inherit_graph_75.md5 @@ -1 +1 @@ -a459960abbd8ceb9c3cfc8dacc286308 \ No newline at end of file +696c31dcb417c720d304d1aa25f8142a \ No newline at end of file diff --git a/inherit_graph_75.png b/inherit_graph_75.png index d54c4cbfd4..bbf9e07c44 100644 Binary files a/inherit_graph_75.png and b/inherit_graph_75.png differ diff --git a/inherit_graph_76.map b/inherit_graph_76.map index ea3ca70c7c..7dca21a900 100644 --- a/inherit_graph_76.map +++ b/inherit_graph_76.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_76.md5 b/inherit_graph_76.md5 index 82310693a3..8567bde63d 100644 --- a/inherit_graph_76.md5 +++ b/inherit_graph_76.md5 @@ -1 +1 @@ -37274f14eb9421a0c1f42c67d3d0be68 \ No newline at end of file +9ad9265d2112957698c0b006ffbb9c93 \ No newline at end of file diff --git a/inherit_graph_76.png b/inherit_graph_76.png index 8409ef99b1..6be80ca249 100644 Binary files a/inherit_graph_76.png and b/inherit_graph_76.png differ diff --git a/inherit_graph_77.map b/inherit_graph_77.map index c266159932..bc42690eb2 100644 --- a/inherit_graph_77.map +++ b/inherit_graph_77.map @@ -1,5 +1,3 @@ - - - + diff --git a/inherit_graph_77.md5 b/inherit_graph_77.md5 index 8be47ec7f6..5fd887f28f 100644 --- a/inherit_graph_77.md5 +++ b/inherit_graph_77.md5 @@ -1 +1 @@ -ca3d6a2e1cf856c662c8c459ab5cfcd5 \ No newline at end of file +ad454d5cabbe4fbb22fb187c62959e5b \ No newline at end of file diff --git a/inherit_graph_77.png b/inherit_graph_77.png index c000d571b5..2fdd68ae52 100644 Binary files a/inherit_graph_77.png and b/inherit_graph_77.png differ diff --git a/inherit_graph_78.map b/inherit_graph_78.map index fd8b3db694..5f551bc014 100644 --- a/inherit_graph_78.map +++ b/inherit_graph_78.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_78.md5 b/inherit_graph_78.md5 index 4727e14b3e..8b87e18954 100644 --- a/inherit_graph_78.md5 +++ b/inherit_graph_78.md5 @@ -1 +1 @@ -4ddc5a8f6814a111f47278bbdc317c02 \ No newline at end of file +76ef0bed23f2f5181de95b344c26a4a0 \ No newline at end of file diff --git a/inherit_graph_78.png b/inherit_graph_78.png index cb68355dc8..7c46d78dbb 100644 Binary files a/inherit_graph_78.png and b/inherit_graph_78.png differ diff --git a/inherit_graph_79.map b/inherit_graph_79.map index 932ed9c3f6..08af1188a0 100644 --- a/inherit_graph_79.map +++ b/inherit_graph_79.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_79.md5 b/inherit_graph_79.md5 index e609fa60ad..e0edf71549 100644 --- a/inherit_graph_79.md5 +++ b/inherit_graph_79.md5 @@ -1 +1 @@ -74b2b83c61e858ec2b16e4b2f78e9b8b \ No newline at end of file +e90ec2ea732a0800942d686e7bf2c61c \ No newline at end of file diff --git a/inherit_graph_79.png b/inherit_graph_79.png index 3eacb1ad1d..813d5aafd1 100644 Binary files a/inherit_graph_79.png and b/inherit_graph_79.png differ diff --git a/inherit_graph_8.map b/inherit_graph_8.map index d6533c7a41..b2de1dbff6 100644 --- a/inherit_graph_8.map +++ b/inherit_graph_8.map @@ -1,38 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/inherit_graph_8.md5 b/inherit_graph_8.md5 index a908b31c49..251ce5e51c 100644 --- a/inherit_graph_8.md5 +++ b/inherit_graph_8.md5 @@ -1 +1 @@ -70142143335e239d2e5d8562900de905 \ No newline at end of file +61124c9d137c6a2d73bed0618814fb5c \ No newline at end of file diff --git a/inherit_graph_8.png b/inherit_graph_8.png index 686649c9a2..9dae5b3622 100644 Binary files a/inherit_graph_8.png and b/inherit_graph_8.png differ diff --git a/inherit_graph_80.map b/inherit_graph_80.map index 6faea1560a..206c488dd7 100644 --- a/inherit_graph_80.map +++ b/inherit_graph_80.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_80.md5 b/inherit_graph_80.md5 index 93fbe11d82..c21aba5bb8 100644 --- a/inherit_graph_80.md5 +++ b/inherit_graph_80.md5 @@ -1 +1 @@ -f3e136512e155e664e88844d9520639e \ No newline at end of file +b0249be726da3058c3528d177aa54856 \ No newline at end of file diff --git a/inherit_graph_80.png b/inherit_graph_80.png index 33ec356b41..29ab71738f 100644 Binary files a/inherit_graph_80.png and b/inherit_graph_80.png differ diff --git a/inherit_graph_81.map b/inherit_graph_81.map index 1f1809581d..10d50dfab7 100644 --- a/inherit_graph_81.map +++ b/inherit_graph_81.map @@ -1,4 +1,4 @@ - - + + diff --git a/inherit_graph_81.md5 b/inherit_graph_81.md5 index d6b4b4b5ca..0722b4faee 100644 --- a/inherit_graph_81.md5 +++ b/inherit_graph_81.md5 @@ -1 +1 @@ -d4f672b4dcb4aabe319a9d0d6e2ca0e0 \ No newline at end of file +1a9157121b281c6fcadbf3b082df380c \ No newline at end of file diff --git a/inherit_graph_81.png b/inherit_graph_81.png index 2fb33b25ed..f1bc0b90bd 100644 Binary files a/inherit_graph_81.png and b/inherit_graph_81.png differ diff --git a/inherit_graph_82.map b/inherit_graph_82.map index ad85268a1c..46d71ca8a7 100644 --- a/inherit_graph_82.map +++ b/inherit_graph_82.map @@ -1,4 +1,90 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inherit_graph_82.md5 b/inherit_graph_82.md5 index 9774fdd15e..5b0280b67b 100644 --- a/inherit_graph_82.md5 +++ b/inherit_graph_82.md5 @@ -1 +1 @@ -363ca6c3ae582816681b0721992bf08a \ No newline at end of file +0c538daec9e8d90ef26f91d83a406c46 \ No newline at end of file diff --git a/inherit_graph_82.png b/inherit_graph_82.png index 0555ee1420..0b940aed76 100644 Binary files a/inherit_graph_82.png and b/inherit_graph_82.png differ diff --git a/inherit_graph_83.map b/inherit_graph_83.map index dc81a5a550..6fa54544a7 100644 --- a/inherit_graph_83.map +++ b/inherit_graph_83.map @@ -1,3 +1,5 @@ - + + + diff --git a/inherit_graph_83.md5 b/inherit_graph_83.md5 index 705b5cf534..15cb47f7b8 100644 --- a/inherit_graph_83.md5 +++ b/inherit_graph_83.md5 @@ -1 +1 @@ -d901d286683c2ea63190cf79224d0c94 \ No newline at end of file +2edd00df79a3e78b94a1bfd49f363fe7 \ No newline at end of file diff --git a/inherit_graph_83.png b/inherit_graph_83.png index bdb8934d47..fdd8a15c99 100644 Binary files a/inherit_graph_83.png and b/inherit_graph_83.png differ diff --git a/inherit_graph_84.map b/inherit_graph_84.map index 950133ef2c..d56b84dcdb 100644 --- a/inherit_graph_84.map +++ b/inherit_graph_84.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_84.md5 b/inherit_graph_84.md5 index de12dafae0..5f86c5919f 100644 --- a/inherit_graph_84.md5 +++ b/inherit_graph_84.md5 @@ -1 +1 @@ -7369e7efafad4a63f79bdd931539bee9 \ No newline at end of file +ecdd2c749df93df9e428a8b0b0ef1ee9 \ No newline at end of file diff --git a/inherit_graph_84.png b/inherit_graph_84.png index 14bf434a0a..ebff3a1270 100644 Binary files a/inherit_graph_84.png and b/inherit_graph_84.png differ diff --git a/inherit_graph_85.map b/inherit_graph_85.map index b8a0663293..81b9a7494c 100644 --- a/inherit_graph_85.map +++ b/inherit_graph_85.map @@ -1,5 +1,4 @@ - - - + + diff --git a/inherit_graph_85.md5 b/inherit_graph_85.md5 index 4af50aaaa2..1ccb331fa3 100644 --- a/inherit_graph_85.md5 +++ b/inherit_graph_85.md5 @@ -1 +1 @@ -0f5df2a5cb5a2f62e466ff7fe630f1f7 \ No newline at end of file +a03d3790a20973aac9460646af05026f \ No newline at end of file diff --git a/inherit_graph_85.png b/inherit_graph_85.png index fca5c77670..88aa814645 100644 Binary files a/inherit_graph_85.png and b/inherit_graph_85.png differ diff --git a/inherit_graph_86.map b/inherit_graph_86.map index 56f12670ec..c05d9a8a5f 100644 --- a/inherit_graph_86.map +++ b/inherit_graph_86.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_86.md5 b/inherit_graph_86.md5 index 3877edc0f2..b9e0ea0baf 100644 --- a/inherit_graph_86.md5 +++ b/inherit_graph_86.md5 @@ -1 +1 @@ -d335af1ffde98e2bda1f529a54d81af7 \ No newline at end of file +e5ad2b4101b0145d747442edc5bbee3e \ No newline at end of file diff --git a/inherit_graph_86.png b/inherit_graph_86.png index c6b9e0b0e2..b16d484f53 100644 Binary files a/inherit_graph_86.png and b/inherit_graph_86.png differ diff --git a/inherit_graph_87.map b/inherit_graph_87.map index eb1c8f31bf..f6a020485d 100644 --- a/inherit_graph_87.map +++ b/inherit_graph_87.map @@ -1,3 +1,4 @@ - + + diff --git a/inherit_graph_87.md5 b/inherit_graph_87.md5 index 4b736a6a69..53dd8ed810 100644 --- a/inherit_graph_87.md5 +++ b/inherit_graph_87.md5 @@ -1 +1 @@ -696c31dcb417c720d304d1aa25f8142a \ No newline at end of file +d499dc833a5b396414675c7410d45377 \ No newline at end of file diff --git a/inherit_graph_87.png b/inherit_graph_87.png index bbf9e07c44..34f1cf082f 100644 Binary files a/inherit_graph_87.png and b/inherit_graph_87.png differ diff --git a/inherit_graph_88.map b/inherit_graph_88.map index 7dca21a900..7234fe3c65 100644 --- a/inherit_graph_88.map +++ b/inherit_graph_88.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_88.md5 b/inherit_graph_88.md5 index 8567bde63d..38a9539476 100644 --- a/inherit_graph_88.md5 +++ b/inherit_graph_88.md5 @@ -1 +1 @@ -9ad9265d2112957698c0b006ffbb9c93 \ No newline at end of file +38ee920d6456a34d6bc7b5b0cfe3ab9e \ No newline at end of file diff --git a/inherit_graph_88.png b/inherit_graph_88.png index 6be80ca249..60e9acf810 100644 Binary files a/inherit_graph_88.png and b/inherit_graph_88.png differ diff --git a/inherit_graph_89.map b/inherit_graph_89.map index bc42690eb2..5e560008e1 100644 --- a/inherit_graph_89.map +++ b/inherit_graph_89.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_89.md5 b/inherit_graph_89.md5 index 5fd887f28f..ca91149eed 100644 --- a/inherit_graph_89.md5 +++ b/inherit_graph_89.md5 @@ -1 +1 @@ -ad454d5cabbe4fbb22fb187c62959e5b \ No newline at end of file +cabfe90dd0c7d6dd0ee4a76df2ed0c38 \ No newline at end of file diff --git a/inherit_graph_89.png b/inherit_graph_89.png index 2fdd68ae52..ff94cbb17e 100644 Binary files a/inherit_graph_89.png and b/inherit_graph_89.png differ diff --git a/inherit_graph_9.map b/inherit_graph_9.map index b2de1dbff6..f6a74398c7 100644 --- a/inherit_graph_9.map +++ b/inherit_graph_9.map @@ -1,6 +1,4 @@ - - - - + + diff --git a/inherit_graph_9.md5 b/inherit_graph_9.md5 index 251ce5e51c..17b25630e5 100644 --- a/inherit_graph_9.md5 +++ b/inherit_graph_9.md5 @@ -1 +1 @@ -61124c9d137c6a2d73bed0618814fb5c \ No newline at end of file +ba64924fb6b41d9694c65dbcdecf6361 \ No newline at end of file diff --git a/inherit_graph_9.png b/inherit_graph_9.png index 9dae5b3622..d61bcd1aaa 100644 Binary files a/inherit_graph_9.png and b/inherit_graph_9.png differ diff --git a/inherit_graph_90.map b/inherit_graph_90.map index 5f551bc014..128686ad13 100644 --- a/inherit_graph_90.map +++ b/inherit_graph_90.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_90.md5 b/inherit_graph_90.md5 index 8b87e18954..cd3d617d29 100644 --- a/inherit_graph_90.md5 +++ b/inherit_graph_90.md5 @@ -1 +1 @@ -76ef0bed23f2f5181de95b344c26a4a0 \ No newline at end of file +5c866b42544fea6737963062c694e45c \ No newline at end of file diff --git a/inherit_graph_90.png b/inherit_graph_90.png index 7c46d78dbb..09ae496298 100644 Binary files a/inherit_graph_90.png and b/inherit_graph_90.png differ diff --git a/inherit_graph_91.map b/inherit_graph_91.map index 08af1188a0..02a25f9e85 100644 --- a/inherit_graph_91.map +++ b/inherit_graph_91.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_91.md5 b/inherit_graph_91.md5 index e0edf71549..50ca718a3f 100644 --- a/inherit_graph_91.md5 +++ b/inherit_graph_91.md5 @@ -1 +1 @@ -e90ec2ea732a0800942d686e7bf2c61c \ No newline at end of file +356e26eadd4741bc864d622f3bc0ba71 \ No newline at end of file diff --git a/inherit_graph_91.png b/inherit_graph_91.png index 813d5aafd1..f05cf2b47d 100644 Binary files a/inherit_graph_91.png and b/inherit_graph_91.png differ diff --git a/inherit_graph_92.map b/inherit_graph_92.map index 31815462cf..0254131034 100644 --- a/inherit_graph_92.map +++ b/inherit_graph_92.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_92.md5 b/inherit_graph_92.md5 index b25e43a329..24225e300a 100644 --- a/inherit_graph_92.md5 +++ b/inherit_graph_92.md5 @@ -1 +1 @@ -c80eda20c94de6183f73ed8408a6472a \ No newline at end of file +97464b8073ac882c2c06be74419632af \ No newline at end of file diff --git a/inherit_graph_92.png b/inherit_graph_92.png index e69fdf3b11..8cc8d1ea44 100644 Binary files a/inherit_graph_92.png and b/inherit_graph_92.png differ diff --git a/inherit_graph_93.map b/inherit_graph_93.map index 206c488dd7..31bd66a846 100644 --- a/inherit_graph_93.map +++ b/inherit_graph_93.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_93.md5 b/inherit_graph_93.md5 index c21aba5bb8..0e81c6d3a5 100644 --- a/inherit_graph_93.md5 +++ b/inherit_graph_93.md5 @@ -1 +1 @@ -b0249be726da3058c3528d177aa54856 \ No newline at end of file +fb11efde3071f90974ffc0bc1154eb46 \ No newline at end of file diff --git a/inherit_graph_93.png b/inherit_graph_93.png index 29ab71738f..5b790753b9 100644 Binary files a/inherit_graph_93.png and b/inherit_graph_93.png differ diff --git a/inherit_graph_94.map b/inherit_graph_94.map index 10d50dfab7..3a94b424bf 100644 --- a/inherit_graph_94.map +++ b/inherit_graph_94.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_94.md5 b/inherit_graph_94.md5 index 0722b4faee..a87cc9b215 100644 --- a/inherit_graph_94.md5 +++ b/inherit_graph_94.md5 @@ -1 +1 @@ -1a9157121b281c6fcadbf3b082df380c \ No newline at end of file +32b7e90f34248a08cf331aaec6f0931a \ No newline at end of file diff --git a/inherit_graph_94.png b/inherit_graph_94.png index f1bc0b90bd..1a3c14cf72 100644 Binary files a/inherit_graph_94.png and b/inherit_graph_94.png differ diff --git a/inherit_graph_95.map b/inherit_graph_95.map index 349a2a03b1..135592c852 100644 --- a/inherit_graph_95.map +++ b/inherit_graph_95.map @@ -1,94 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/inherit_graph_95.md5 b/inherit_graph_95.md5 index a53311abb5..5d847ef074 100644 --- a/inherit_graph_95.md5 +++ b/inherit_graph_95.md5 @@ -1 +1 @@ -026c29e632538be57fe2abd0ec741b09 \ No newline at end of file +855b48930a96a02088d3630ce2c08980 \ No newline at end of file diff --git a/inherit_graph_95.png b/inherit_graph_95.png index a8eaf646ee..c169b3c5a5 100644 Binary files a/inherit_graph_95.png and b/inherit_graph_95.png differ diff --git a/inherit_graph_96.map b/inherit_graph_96.map index d56b84dcdb..dc1ab3d140 100644 --- a/inherit_graph_96.map +++ b/inherit_graph_96.map @@ -1,4 +1,3 @@ - - + diff --git a/inherit_graph_96.md5 b/inherit_graph_96.md5 index 5f86c5919f..e4fc90e47c 100644 --- a/inherit_graph_96.md5 +++ b/inherit_graph_96.md5 @@ -1 +1 @@ -ecdd2c749df93df9e428a8b0b0ef1ee9 \ No newline at end of file +12c61d7d05f6b06671f58ffe91c3cb2e \ No newline at end of file diff --git a/inherit_graph_96.png b/inherit_graph_96.png index ebff3a1270..424492e34a 100644 Binary files a/inherit_graph_96.png and b/inherit_graph_96.png differ diff --git a/inherit_graph_97.map b/inherit_graph_97.map index 643b460db2..43d4244ca6 100644 --- a/inherit_graph_97.map +++ b/inherit_graph_97.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_97.md5 b/inherit_graph_97.md5 index e5dd7b670b..983bcd0a1f 100644 --- a/inherit_graph_97.md5 +++ b/inherit_graph_97.md5 @@ -1 +1 @@ -cd248952f9d3fb28db6d1340e73825c6 \ No newline at end of file +b0db055b29cab9497f12839e79b19364 \ No newline at end of file diff --git a/inherit_graph_97.png b/inherit_graph_97.png index ed0dc2a1ac..01c9d3edeb 100644 Binary files a/inherit_graph_97.png and b/inherit_graph_97.png differ diff --git a/inherit_graph_98.map b/inherit_graph_98.map index c7aabefa2c..5dc2f1a3e1 100644 --- a/inherit_graph_98.map +++ b/inherit_graph_98.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_98.md5 b/inherit_graph_98.md5 index d8d204c383..71a9ab573f 100644 --- a/inherit_graph_98.md5 +++ b/inherit_graph_98.md5 @@ -1 +1 @@ -b56f4bc08a687a8562b94e401057b5b1 \ No newline at end of file +00dd9285f22e84faa176aa154852ccf8 \ No newline at end of file diff --git a/inherit_graph_98.png b/inherit_graph_98.png index a836e3e140..1338a63a98 100644 Binary files a/inherit_graph_98.png and b/inherit_graph_98.png differ diff --git a/inherit_graph_99.map b/inherit_graph_99.map index 840ba36007..cdc763c05f 100644 --- a/inherit_graph_99.map +++ b/inherit_graph_99.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_99.md5 b/inherit_graph_99.md5 index 349b1702e1..ba6bb45120 100644 --- a/inherit_graph_99.md5 +++ b/inherit_graph_99.md5 @@ -1 +1 @@ -57a85c1d663465162e8e2abb966719d2 \ No newline at end of file +7405905bb95d87065a7679d129468c67 \ No newline at end of file diff --git a/inherit_graph_99.png b/inherit_graph_99.png index 3481f08d09..2f4a512add 100644 Binary files a/inherit_graph_99.png and b/inherit_graph_99.png differ diff --git a/inherits.html b/inherits.html index 6932a7f19a..930d435526 100644 --- a/inherits.html +++ b/inherits.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -124,31 +124,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - + + + - - - - - - - + - + - + @@ -156,14 +150,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + @@ -203,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + @@ -211,50 +205,45 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - + - + - + - + - + - + - + - + @@ -265,43 +254,43 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + - + - + - + - + - + @@ -309,28 +298,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + - + - + @@ -338,12 +327,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + @@ -353,47 +342,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - + - + - - - - - - + - - - - - - + - + @@ -411,131 +380,111 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + - + - + - + - + - + - + - + - - - - - - + - + - + - + - + - + - - - - - - - - - - - - - - - - + - + - + - + @@ -546,57 +495,52 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + - + - + - - - - - - + - + - + - + - + @@ -606,679 +550,499 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - + - + - + - + - + - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - + - - - - + + + + - + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - - - - - - - - - - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - + - + - + - + - + - + - + - + - - - - - - + - - - - - - + - + - - - - - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html index f98a239114..e378e45f4b 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html index 7d643cc529..cff06a6031 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client-members.html index 0dd99aaad7..7d03305060 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html index 675c633b2e..0d3c23387e 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html index 21334dffce..5eaed1a5e3 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html index 5a51984fac..fb2ab7a195 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html index 08f4214d01..6d5a8fa2e2 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html index 353407a4fc..a954082642 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html index 2e77c6a660..f65863f700 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html index 8837553128..ea9e29ea2e 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client-members.html index 028d10be16..e46fa0457b 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html index 08d8a504c4..d6205d9bb6 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client-members.html index 073a5bed23..3ad847538f 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html index f3b976b7bf..154f611800 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html index 4f07d05ef5..ba3f58716f 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html index fadfd8310b..ac4ebf4c32 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client-members.html index 7fad79b6d3..bf375e8fda 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html index 3f8c19be2e..ae2808be9c 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client-members.html index 1a4771eafa..806d2c65da 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client-members.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client-members.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html index a3c520469f..ff9cf96d1d 100644 --- a/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html @@ -25,7 +25,7 @@ Logo
    tgstation-server -  4.2.4 +  4.2.5
    The /tg/station 13 server suite
    @@ -219,18 +219,6 @@ Public Member Functions

    Implemented in Tgstation.Server.Client.AdministrationClient.

    -

    Referenced by Tgstation.Server.Tests.IntegrationTest.TestUpdateProtocol().

    - -

    -Here is the caller graph for this function:
    -
    -
    - - - -
    -

    -
    The documentation for this interface was generated from the following file: